varchar
s og lighed er tornede i TSQL. LEN
funktion siger:
Returnerer antallet af tegn i stedet for antallet af bytes af det givne strengudtryk, ekskluderer efterfølgende blanktegn .
Du skal bruge DATALENGTH
for at få en ægte byte
antal af de pågældende data. Hvis du har unicode-data, skal du bemærke, at den værdi, du får i denne situation, ikke vil være den samme som længden af teksten.
print(DATALENGTH(' ')) --1
print(LEN(' ')) --0
Når det kommer til lighed af udtryk, sammenlignes de to strenge for lighed som denne:
- Få kortere streng
- Pad med blanks indtil længden er lig med den længere streng
- Sammenlign de to
Det er det midterste trin, der forårsager uventede resultater - efter det trin sammenligner du effektivt mellemrum med mellemrum - derfor ses de at være ens.
LIKE
opfører sig bedre end =
i "blanks" situationen, fordi den ikke udfører blank-padding på det mønster, du forsøgte at matche:
if '' = ' '
print 'eq'
else
print 'ne'
Vil give eq
mens:
if '' LIKE ' '
print 'eq'
else
print 'ne'
Vil give ne
Forsigtig med LIKE
dog:den er ikke symmetrisk:den behandler efterstillede mellemrum som signifikant i mønsteret (RHS), men ikke matchudtrykket (LHS). Følgende er taget herfra:
declare @Space nvarchar(10)
declare @Space2 nvarchar(10)
set @Space = ''
set @Space2 = ' '
if @Space like @Space2
print '@Space Like @Space2'
else
print '@Space Not Like @Space2'
if @Space2 like @Space
print '@Space2 Like @Space'
else
print '@Space2 Not Like @Space'
@Space Not Like @Space2
@Space2 Like @Space