Avatar billede jobba Nybegynder
27. januar 2003 - 15:41 Der er 8 kommentarer og
1 løsning

Case check på første bogstav i Felt.

Hvordan kan jeg lave en check constraint, som tjekker om første bogstav i et felt er stort?
Avatar billede larildsen Nybegynder
27. januar 2003 - 16:10 #1
Måske ikke den mest elegante løsning, men den virker

CREATE TABLE TableA(ColA VARCHAR(10))
GO
ALTER TABLE TableA ADD CONSTRAINT TableA_Check_Constraint CHECK(Upper(SubString(ColA,1,1))=SubString(ColA,1,1))
go
Avatar billede jobba Nybegynder
27. januar 2003 - 16:29 #2
Det virker ikke!

Jeg prøvede endda at gennemtvinge en fejl ved at lave denne check constraint:
(Upper(SubString(ColA,1,1))=Lower(SubString(ColA,1,1)))

Det er som om databasen er total ligeglad med cases.
Avatar billede larildsen Nybegynder
27. januar 2003 - 16:36 #3
Hmmmm det var som .....
Her er hvad jeg skrev i min Query Analyzer:
DROP TABLE TableA
GO
CREATE TABLE TableA(ColA VARCHAR(10))
GO
ALTER TABLE TableA ADD CONSTRAINT TableA_Check_Constraint CHECK(Upper(SubString(ColA,1,1))=SubString(ColA,1,1))
go
insert into TableA values ('aaaa')
go

og her er output:
Server: Msg 547, Level 16, State 1, Line 1
INSERT statement conflicted with COLUMN CHECK constraint 'TableA_Check_Constraint'. The conflict occurred in database 'Northwind', table 'TableA', column 'ColA'.
The statement has been terminated.
Avatar billede jobba Nybegynder
27. januar 2003 - 17:42 #4
Jeg ved ikke hvad der går galt.
Hvis jeg kører dit script på en nyoprettet database, melder den ingen. Den siger bare:
1 row(s) affected.

Jeg kører MS-SQL 2000.
Avatar billede larildsen Nybegynder
27. januar 2003 - 18:40 #5
Hmmmmmm jeg undrer mig.
Måske det kunne have noget med Collating Sequence eller lignende at gøre.
Jeg checker det senere iaften.

Jeg kører også M$Sql 2000
Avatar billede janus_007 Nybegynder
28. januar 2003 - 22:20 #6
"Det er som om databasen er total ligeglad med cases."...

Ja det er også korrekt som default, du skal sætte den til at være case-sensitiv ved installationen eller oprettelse af db'en !!

En måde at checke for case på er vha. ASCIIkoder, men det er lidt besværligt lige i dit tilfælde.
Avatar billede larildsen Nybegynder
30. januar 2003 - 20:46 #7
Hmmm.... Janus,

min eksempel constraint blev afviklet på en DB, der havde collating sequence Danish_Norwegian_CI_AS,

hvilket vil sige af collating sequence var Case InSensitive.

Det kan måske gøre en forskel, om der er index på collonnen eller ej
Avatar billede kichian Nybegynder
02. februar 2003 - 14:08 #8
Det er normalt at 'a' er det samme som 'A'. Og selv med index burde det ikke gøre nogen forskel.

Din constraint skal være:
CHECK(convert(binary,upper(substring([ColA],1,1))) = convert(binary,substring([ColA],1,1)))

I stedet for at convertere til binary, kan du også bruge funktionen ASCII. Men converteringen kan bruges generelt på strenge af vilkårlig længde.
Avatar billede jobba Nybegynder
19. februar 2003 - 09:37 #9
Jeg har ikke lige mulighed for at teste det nu. Men det ligner et svar jeg kan acceptere :-D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester