# Sunday, October 30, 2005

Default collation på SQL Server er case-insensitive. Det er som oftest også det smarteste, så man ikke behøver koncentrere sig om at skrive f.eks. object navne med den rigtige case. Ind imellem kunne det dog være rart, hvis man kunne lave en case-sensitive WHERE-clause, f.eks. i forbindelse med, at en bruger angiver password til login.

Eks:

SELECT * FROM tbl_User WHERE Password = 'superfly'

Denne returnerer både dem der har password: superfly, Superfly, SUPERFLY og lign., hvilket ikke er hensigtsmæssigt.
 
Følgende lille trick giver til gengæld det ønskede resultat:

SELECT * FROM tbl_User WHERE CONVERT(BINARY, Password) = CONVERT(BINARY, 'superfly')

Nu vil kun brugere med password superfly blive returneret. Den binære værdi for f.eks. s og S er forskellig, så nu risikerer vi ikke at få uønskede rækker returneret.

Den betænksomme SQL programmør vil nu gøre opmærksom på, at et evt. index på kolonnen Password ikke længere vil kunne anvendes, men at der vil skulle en table-scan til for at finde den ønskede brugere.

Dette kan man komme ud over med denne færdig SELECT:

SELECT * FORM tbl_User WHERE Password = 'superfly' AND CONVERT(BINARY, Password) = CONVERT(BINARY, 'superfly')

Et index kan nu anvendes til at finde de brugere, der har password superfly i en elle anden form, og til sidst fjernes de brugere, der så ikke har det på den rigtige form (den rigtige case).

Vores mål er nu nået og vi har lavet en case-sensitive WHERE-clause på en database med case-insensitive collation.

Sunday, October 30, 2005 8:14:13 PM (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Friday, October 28, 2005

SQL Server 2005 Management Studio tilbyder to keyboard skemaer. Nu hvor SQL Server arbejdet foregår i en Visual Studio skal, er default meget naturligt baseret herpå. Du har dog også mulighed for at vælge et skema kaldet SQL Server 2000, hvis du er lidt mere nostalgisk.

Det betyder selvfølgelig, at du skal lære nogle nye genveje (i hvert fald hvis du vil bruge default skemaet), men hvis du i forvejen også udvikler i Visual Studio.NET kommer det hurtigt, og så er det rart ikke at skulle huske to forskellige genveje til f.eks. kommentere den valgte tekst ud og ind.

Kommenter ud:
CTRL+SHIFT+C bliver til CTRL+K, CTRL+C

Kommenter ind:
CTRL+SHIFT+R bliver til CTRLl+K, CTRL+U

Alle genveje til SQL Server 2000 Qyery Analyser

Alle genveje til SQL Server 2005 Management Studio

Nå, ja. Hvis dette er den eneste blog, du læser, skulle jeg nok lige sige, at SQL Server 2005 og Visual Studio 2005 i dag er kommet til download på MSDN. Hvis dette ikke er den eneste blog, du læser, har du nok allerede lukket dette vindue - der er grænser for hvor mange gange, man gider læse det samme.

Friday, October 28, 2005 2:31:01 PM (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [1]  | 
# Wednesday, October 26, 2005

Som nævnt tidligere er denne blog også lidt at betragte som min digitale hukommelse. Efterhånden er jeg ved at have fundet disse SQL statements så mange gange i mine andre arkiver, at de er ved at hænge ved. Men måske der er andre, der ikke har så meget orden i papirarkiverne som jeg(!?!), og som finde det lettere at slå op på nettet. Her kommer 3 metoder til at slette dubletter i en tabel:

Vi vil gå ud fra en tabel med personer, som har følgende definition:

CREATE TABLE tbl_Person (
Id INT IDENTITY(1, 1),
FirstName VARCHAR(50),
LastName VARCHAR(50)
)

og målet er at slette dubletter af kombinationen FirstName og LastName.

Metode 1:
DELETE tbl_Person
FROM tbl_Person AS P1
WHERE EXISTS (SELECT 1 FROM tbl_Person AS P2 WHERE P2.Id > P1.Id and P1.FirstName = P2.FirstName and P1.LastName = P2.LastName)

Skeler man til performance er denne metode noget af det mest effektive man kan komme op med.

Metode 2:
DELETE P1
FROM tbl_Person AS P1
INNER JOIN tbl_Person AS P2 ON P1.FirstName = P2.FirstName AND P1.LastName = P2.LastName AND P1.Id > P2.Id

Og endelig metode 3:
DELETE tbl_Person
FROM tbl_Person AS P1
WHERE Id > (SELECT MIN(Id)
FROM tbl_Person AS P2
WHERE P1.FirstName = P2.FirstName
AND P1.LastName = P2.LastName)

Alle tre metoder gør det samme, nemlig sletter dubletter. Som altid når man sletter flere rækker er det en god idé at SELECT’e rækkerne ud før man sletter dem, så man sikrer at det ser rigtigt ud.

Wednesday, October 26, 2005 3:25:13 PM (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [0]  | 
# Tuesday, October 25, 2005

Så skete det! Efter længere tids moderat (fysisk(?)) pres fik jeg endelig presset min kollega, Søren Lund, til at sætte dasBlog op til mig, så jeg kan få gang i SQLJoint igen. Hermed er jeg også klar til at tage skridtet ind i det 21. århundrede - det var ved at blive lidt ensomt tilbage i den 20.

Sitet vil hovedsagelige komme til at indeholde posts, der på den ene eller anden måde har med SQL Server at gøre: T-SQL, DTS, Integration Services, Analysis Services osv. Skulle jeg falde over et andet udvikler relateret trick, kunne det også ske at finde vej til denne digitale udgave af min hukommelse. Endelig kan det ikke udelukkes, at der vil snige sig en enkelt eller to komplet irrelevante - set med SQL Server eller udvikler øjne - posts ind.

- Sune

Tuesday, October 25, 2005 6:45:14 PM (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [0]  |