SQL support
SQL er det sprog database kommunikerer i. Her følger information om grundlæggende SQL.
SQL kald kan køres via Enterprise Manager, Query Analyzer eller via ASP kode.
Søgefunktioner
De fleste er vant til at bruge wildcards, hvor ? betyder en tilfældig karakter og * betyder et antal tilfældige karakterer. I SQL bruger man _ til en tilfældig karakter og % til et antal tilfældige karakterer.
| Søgefunktion | Beskrivelse |
|---|---|
| ORDER BY felt [ASC|DESC] | Sorterer posterne efter felt og returnerer dem med det mindste først. Brug ASCending og DESCending for at bestemme søgeorden. |
| LIKE 'tekst' | Hvad du søger efter. felt LIKE 'P_t%' finder Peter men ikke Peeter. Du kan også bruge visse regular expressions, for eksempel [0-3]. |
| felt IN | felt IN ('abc', 'def') returnerer sand hvis feltet indeholder abc eller def. Husk at du ikke kan bruge wildcards i en IN sætning. |
| felt IS NULL | Er posten lig med NULL (ikke eksisterende) |
| felt BETWEEN lilletal AND storttal | Er posten imellem to tal |
| [where], [felt med mellemrum] | Hvis dit felt skal hedde noget SQL allerede bruger (where, and, or) eller dit felt skal bruge 'ulovlige' karakterer skal du sætte firkantede parenteser omkring. |
Regnemetoder
SQL har også alle de regnefunktioner man kan få brug og man kan for eksempel også få antallet af poster ved at calde COUNT(*) i stedet for at hente selve posterne.
| Regnefunktion | Beskrivelse |
|---|---|
| SUM | Summen af posterne |
| COUNT | Antal poster |
| EXISTS | Sand hvis der er minimum en post der passer på dit SQL kald. |
| TOP n [PERCENT] | 'SELECT TOP 10 *' viser de 10 første forekomster. Kan kombineres med ORDER BY for at se de sidste. |
| MIN | |
| MAX | |
| AVG | |
| ALL | |
| ANY | |
| SOME |
Faq
AspToday om XML i SQL 2000Kan jeg uploade filer (billeder) direkte ind i min SQL database?
Det er muligt at lægge binære filer ind i en database. Det er dog langt smartere (hurtigere) at indlægge et link til en fysisk fil i databasen, og så beholde selve filen på webserveren.
Skal jeg bruge NULL eller NOT NULL?
Hvis du sætter NULL (altså NULLS er tilladt) så risikerer du at du ikke kan opdatere dine data via Recordsets fordi den ikke kan danne værdien. Hvis du sætter NOT NULL så har du det problem at du ikke kan checke på om feltet indeholder NULL men skal checke på tom streng ved strengværdier, på 00-00-0000 00:00 for datoer etc. Du kan altså ikke på samme lette måde se om der er skrevet data i feltet eller ej. Hvis du sætter NOT NULL så kan du ikke bruge COUNT til at tælle antal poster da COUNT netop er "samlede poster minus dem der er NULL i dette felt".
Hvordan bruger jeg et ID felt?
Sæt altid dit ID felt (din nøgle) til UNIQUE og ret aldrig i feltet. Så risikerer du ikke at have to felter der har samme ID og samme poster, hvorved SQL serveren ikke kan skelne mellem de to poster.
Serveren kan ikke nå at forbinde?
Forhøj timeout værdien til SQL serveren: "Connect Timeout=15;".
Hvad er ANSI SQL?
Ansi SQL er standard SQL, som de fleste SQL databaser bygger videre på. Du kan se hele standarden i sql1992.txt, bemærk dog at den fylder 1.7 MegaByte.
Forskelle i data/felttyper for forskellige databaser
En liste over forskellige SQL reserved words, SQL and Jet datatypes, forskelle mellem ANSI SQL og Jet SQL "Equivalent ANSI SQL Data types".
| Beskrivelse | MS SQL | MySQL | Access |
|---|---|---|---|
| Felttyper | |||
| Integer | int | ? | ? |
| Large integer | bigint | ? | integer |
| Karakterer | varchar | varchar | text |
| Tekstfelt | text | ? | memo |
| Dato | datetime | ? | date |
| Autonummereret | bigint IDENTITY | ? | counter / autoincrement |
| Ja/nej | bit | ? | bit |
| Andet | |||
| Quote karakterer | [navn] | `navn` | [navn] |
Boolean (bit) forskelle
Virker i Access men ikke i MS SQL:
SELECT * FROM tabel WHERE felt = TRUE SELECT * FROM tabel WHERE felt = FALSE
Virker i MS SQL men ikke i Access (hvor sandt = -1):
SELECT * FROM tabel WHERE felt = 1 SELECT * FROM tabel WHERE felt = 0
For at dit select/update kald virker både i Access/SQL og i alle typer connection-strings, bør du altså bruge:
SELECT * FROM tabel WHERE felt <> 0 SELECT * FROM tabel WHERE felt = 0 UPDATE tabel SET felt = 1 -- Ved update vil Access konvertere det til -1 UPDATE tabel SET felt = 0
Wildcards
Hvis du har brug for at bruge udvidede wildcards i søgninger, skal du bruge firkantede parenteser rundt om teksten, du kan for eksempel finde alle resultater der indeholder karaktererne a-z ved at søge på LIKE [a-z].
| Symbol | Resultat |
|---|---|
| LIKE '5[%]' | 5% |
| LIKE '[_]n' | _n |
| LIKE '[a-cdf]' | a, b, c, d, or f |
| LIKE '[-acdf]' | -, a, c, d, or f |
| LIKE '[ [ ]' | [ |
| LIKE ']' | ] |
| LIKE 'abc[_]d%' | abc_d and abc_de |
| LIKE 'abc[def]' | abcd, abce, and abcf |
Eksempler
Sørger for at SQL serveren ikke checker din nye constraint på eksisterende data
WITH NOCHECK
Slår constraints fra (CHECK slår til)
ALTER TABLE tabel NOCHECK
Hvis dit login har adgang til flere databaser kan du sætte hvilken der skal arbejdes på med følgende kald forrest:
USE database
Husk at der intet er til hinder for at lave en kæmpemæssig SQL sætning, f.eks.:
CREATE TABLE ... INSERT INTO ... VALUES .... INSERT INTO ... VALUES ....
Sletter en tabel
DROP TABLE tabel
Opret en ny tabel
CREATE TABLE tabel ( ID int NOT NULL IDENTITY(1,1) PRIMARY KEY, Name varchar(25) NOT NULL DEFAULT '', Notes varchar(25) NULL, Date datetime NOT NULL DEFAULT GETDATE() ) 'Assuming cn is an ADODB connection object and is open and the account has rights to alter the table (SQL Server) <% 'connection info here.... cn.execute "ALTER TABLE tblClient ADD NumKids INT NULL" %>
Ret en tabel og sæt et felt til Primary key (nøgle)
ALTER TABLE tabel ADD CONSTRAINT CN_felt PRIMARY KEY (felt)
Opret et nyt felt i en tabel
ALTER TABLE tabel ADD NytFelt datetime
Opret et nyt felt og sæt en standardværdi
ALTER TABLE tabel ADD NytFelt2 text NOT NULL DEFAULT 'Hej'
Sæt en standard værdi på et eksisterende felt
ALTER TABLE tabel ADD CONSTRAINT CN_NameDefault DEFAULT 'standard værdi' FOR felt
Tving feltet Status i SubDomain til kun at indeholde de data der findes i Tabel(Felt)
ALTER TABLE tabel ADD CONSTRAINT FK_tabel2 FOREIGN KEY (felt) REFERENCES tabel2(felt)
Poster
Indsætter en ny post med data.
INSERT INTO tabel (ID, Name, Notes) VALUES (1, 'Per', 'Vores første kunde')
Indsætter flere poster samtidigt.
INSERT INTO tabel (ID, Name, Notes) SELECT 1, 'Per', 'Vores første kunde' UNION ALL SELECT 2, 'Karsten', 'Vores anden kunde' UNION ALL SELECT 3, 'Søren', 'Vores tredje kunde'
Kopierer data fra en anden tabel hvor WHERE sætningen matcher.
INSERT INTO tabel (Name, Notes) SELECT Name, Notes FROM tabel2 WHERE (Name LIKE 'Anders')
Sletter poster fra tabellen hvor WHERE matcher.
DELETE FROM tabel WHERE (Name LIKE 'Per')
Opdaterer de poster hvor din WHERE sætning matcher.
UPDATE tabel SET Name = 'Søren', Notes = 'Hov, han hedder jo Søren' WHERE Name LIKE 'Per'
Finder alle poster hvor felt starter med a,b,c,d eller e.
SELECT * FROM tabel WHERE felt LIKE '[a-e]%'
Finder alle poster i felt hvor ordet bil indgår for sig selv, altså ikke racerbil eller lastbil.
SELECT * FROM tabel WHERE felt LIKE '%[ ,.;:]bil[ ,.;:]%'
Returnerer antal poster hvor felt ikke er sat og derfor er NULL (ikke eksisterende).
SELECT COUNT(*) FROM OrderList WHERE Domain IS NULL
Søg i datetime kolonner.
WHERE (FELT >= '2001-08-16') AND (FELT < '20010817') WHERE (MissingStart LIKE '%aug_16_2001%')
SQL forstår dataene i formatet YYYYMMDD hh:mm:ss.fff, du kan dog godt udelade nogen data og separatortegn er valgfrie. I ovenstående eksempel får vi altså alle poster hvor felt er et tidspunkt, den 16. august 2001. I den anden linje lader vi SQL fortolke datoen og så er sorteringen anderledes og afhængig af det valgte sprog. Hvis vi i den anden linje vælger datoen den 1. august vil det dog gå galt, uanset om vi skriver 1 eller 01.
Collations og sortering
Vores danske servere kører som standard med collation "Danish_Norwegian_CI_AS" hvilket påvirker sorteringen af dataene i dine kolonner. Du vil muligvis opleve at du får brug for den mere internationale "SQL_Latin1_General_CP1_CI_AS" eller andre collations (sorteringer) og du kan selv via SQL kommandoer ændre dette.
For at ændre hele databasens collation eksekverer du:
ALTER DATABASE DatabaseNavn COLLATE SQL_Latin1_General_CP1_CI_AS
Dette påvirker dog kun fremtidige tabeller og ikke eksisterende du allerede har oprettet. For at rette
eventuelle eksisterende tabeller skal du for alle kolonner køre:
ALTER TABLE TabelNavn ALTER COLUMN NavnPåFørsteKolonne
varchar(10)COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
Bemærk at ALTER DATABASE kræver at der ikke er nogen andre brugere der har databasen åben.
