# Friday, 10 March 2006

Okay, jeg synes nu egentlig meget godt om SQL Server, men det er jo ikke alle der deler min mening:

Top 10 Things I Hate About SQL Server

Husk også at læse kommentarerne :o)

Friday, 10 March 2006 12:33:46 (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [2]  | 
# Friday, 25 November 2005

Det er ikke de helt vildt streng funktioner, der findes i T-SQL (okay, måske bliver jeg klogere, når jeg får sat mig mere ind i T-SQL udvidelserne i SQL Server 2005, men i hvert fald ikke i SQL Server 2000). Men selv med de simple funktioner kan man lave nogle små fikse ting, hvis det bliver sat rigtigt sammen. I det følgende skal vi finde ud af, hvor mange gange et bestemt ord findes i en kolonne.

Vi har følgende table:

CREATE TABLE tbl_Demo (
    DemoID INT,
    Description VARCHAR(8000)
)    

I den tabel vil vi finde ud af hvor mange gange order "server" i hver rækkes Description felt. Det kan gøres på følgende måde:

SELECT Description, (LEN(Description) - LEN(REPLACE(Description, 'server', ''))) / LEN('server') AS WordCount
FROM tbl_Demo

Vi tager kort fortalt længden af Description feltet inkl. alle gange order "server" måtte optræde, og trækker længden af Description feltet uden ordet "server" fra. For at finde antallet af gang ’server’ indgår dividerer vi dette tal med længden af "server".

Ved også at bruge udtrykket i en Order By kan vores statement tilmed bruges som en søgefunktion, der sortere de mest relevante resultater øverst:

SELECT Description, (LEN(Description) - LEN(REPLACE(Description, 'server', ''))) / LEN('server') AS WordCount
FROM tbl_Demo
ORDER BY WordCount DESC

Måske ikke lige frem optimalt hvad angår performance, men trods alt en prioriteret søgning.

Friday, 25 November 2005 14:55:44 (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [1]  | 
# Friday, 18 November 2005

Niks, det er derimod den seneste blog på min rulle. Microsoft SQL Server Development Customer Advisory Team er det mundrette navn på denne forholdsvis nye blog med best practices og erfaringer fra nogle af verdens mest krævende SQL Server installationer.

Mon ikke de fleste af os kan lære lidt når så erfarne folk begynder at dele lidt ud?

Friday, 18 November 2005 12:18:39 (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Friday, 11 November 2005

Microsoft tilbyder i hele november 8 gratis eLearning kurser om SQL Server med emner som:

  • Installing and Securing Microsoft SQL Server 2005
  • Programming SQL Server 2005
  • Creating the Data Access Tier Using Microsoft SQL Server 2005
  • New Features of Microsoft SQL Server 2005 Analysis Services

Kurserne findes på https://www.microsoftelearning.com/catalog/default.aspx, og kan downloades, så de kan ses offline.

Som om det ikke er nok, er der ind til 17. november 7 gratis Visual Studio 2005 kurser, som også kan downloades. Efter download har du 90 dage til at få dem set, så det er bare med at komme i gang.

Friday, 11 November 2005 10:46:01 (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Wednesday, 09 November 2005

En hurig måde i Management Studio eller Query Analyzer at få oplysninger om objektet tbl_Product i følgende query:

SELECT * FROM tbl_Product

er at markere objektnavnet og trykke ALT+F1.

Dette svarer til at eksekvere

SP_HELP tbl_Product

og returnerer alle objektdetaljer, som kolonne oplysninger, index information og constraints.

Wednesday, 09 November 2005 15:06:50 (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Wednesday, 02 November 2005

Skal du udvikle noget, som skal kunne afvikles på en tidligere version af SQL Server end din udviklingsmaskine, kan du med fordel ændre kompatibilitets niveau. Herved kan du sikre at din T-SQL er kompatibel med en tidligere version af SQL Server.

Kompatibilitets niveau skiftes på følgende måde:

SQL Server 2000
Højre klik på den aktuelle database i Enterprise Manager og vælg Properties. Vælg tabben Options og du har nu mulighed for at ændre kompatibilitets niveau.

SQL Server 2005
Højreklik på den aktuelle database i Management Studio og vælg Properties. Vælg siden Options, og du har nu mulighed for at ændre kompatibilitets niveau i drop down boksen.

Vær opmærksom på at SQL Server 2000 kan sættes til at være kompatibel med versioner helt tilbage til SQL Server 6.0, men SQL Server 2005 "kun" går tilbage til 7.0.

Wednesday, 02 November 2005 14:34:04 (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Sunday, 30 October 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, 30 October 2005 20:14:13 (GMT Standard Time, UTC+00:00)  #    Disclaimer  |  Comments [0]  | 
# Friday, 28 October 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, 28 October 2005 14:31:01 (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [1]  | 
# Wednesday, 26 October 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, 26 October 2005 15:25:13 (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [0]  | 
# Tuesday, 25 October 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, 25 October 2005 18:45:14 (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [0]  |