tsql - over - roll up sql server 2008
SQL Server descarta SPACE durante GROUP BY (2)
Parece que SQL Server (probado en 2008 R2) está haciendo un RTRIM
en columnas en la cláusula GROUP BY
. ¿Alguien notó esto? ¿Me estoy perdiendo de algo?
Las dos selecciones están devolviendo el mismo conjunto de resultados en la siguiente consulta, que no debería ser el caso, creo.
declare @t table(Name varchar(100), Age int)
insert into @t values (''A'', 20)
insert into @t values (''B'', 30)
insert into @t values (''C'', 40)
insert into @t values (''D'', 25)
insert into @t values ('' A'', 21)
insert into @t values (''A '', 32)
insert into @t values ('' A '', 28)
select
Name,
count(*) Count
from @t
group by Name
select
rtrim(Name) RtrimmedName,
count(*) Count
from @t
group by rtrim(Name)
Por favor, hágame saber sus pensamientos...
De hecho, está haciendo lo contrario, pero los efectos observables son los mismos.
Al comparar dos cadenas de longitud desigual, una de las reglas de SQL (el estándar, no solo SQL Server) es que la cadena más corta se rellena con espacios hasta que tenga la misma longitud, y luego se realiza la comparación.
Si desea evitar ser sorprendido, deberá agregar un carácter que no sea espacio al final de cada cadena.
De hecho, al revisar el texto estándar , parece que hay dos opciones:
4.6 Tipo de conversiones y mezcla de tipos de datos
...
Cuando se comparan valores de longitud desigual, si la secuencia de clasificación para la comparación tiene el atributo
NO PAD
y el valor más corto es igual a un prefijo del valor más largo, entonces el valor más corto se considera menor que el valor más largo. Si la secuencia de clasificación para la comparación tiene el atributoPAD SPACE
, a los efectos de la comparación, el valor más corto se extiende efectivamente a la longitud del más largo por la concatenación de <space> s a la derecha.
Pero todas las colaciones de SQL Server de las que tengo conocimiento son PAD SPACE
.
Esto es más fácil de ver:
declare @t table (Name varchar(100), Age int)
insert @t values(''A'', 20),(''B'', 30),(''C'', 40),(''D '', 25)
,('' A'', 21),(''A '', 32),('' A '', 28),(''D '',10);
select Name, Replace(Name,'' '',''-''),
count(*) Count
from @t
group by Name
--
NAME COLUMN_1 COUNT
A -A 2
A A- 2
B B 1
C C 1
D D-- 2
Observe el espacio entre A y punto. Eligió la versión de 1 espacio sobre el espacio de 0.
Observe también que el grupo D elige el que tiene 2 espacios finales sobre el 4.
Entonces, no , no está realizando un RTRIM. Sin embargo, es algo así como un error suave , porque está eligiendo arbitrariamente una de las dos columnas (la que primero encontró) como resultado de GROUP BY, que posiblemente podría desanimarlo si los espacios fueran importantes.