sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué la declaración de selección de SqlServer seleccionaría filas que coinciden y filas que coinciden y tienen espacios finales?

Para reelaborar mi respuesta, LEN() no es seguro para probar ANSI_PADDING ya que está definido para devolver la longitud excluyendo los espacios finales, y DATALENGTH() es preferible como dice AdaTheDev.

Lo que es interesante es que ANSI_PADDING es una configuración de tiempo de inserción y que se respeta para VARCHAR pero no para NVARCHAR.

En segundo lugar, si se devuelve una columna con espacios finales o se usa el '=' para la igualdad, parece que se produce un truncamiento implícito del espacio final.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING OFF
GO
CREATE TABLE [dbo].[TestFeature1](
[Id] [varchar](50) NOT NULL,
[Leng] [decimal](18, 0) NOT NULL
) ON [PRIMARY]

GO

insert into TestFeature1 (id,leng) values ('1',100); insert into TestFeature1 (id,leng) values ('1 ',1000);

-- verify no spaces inserted at end
select '['+id+']', * from TestFeature1
select datalength(id), * from TestFeature1
go

DROP TABLE [dbo].[TestFeature1]
go
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING OFF
GO
CREATE TABLE [dbo].[TestFeature1](
[Id] [nvarchar](50) NOT NULL,
[Leng] [decimal](18, 0) NOT NULL
) ON [PRIMARY]

GO

insert into TestFeature1 (id,leng) values ('1',100); insert into TestFeature1 (id,leng) values ('1 ',1000);

-- verify spaces inserted at end, and ANSI_PADDING OFF was not honoured by NVARCHAR
select '['+id+']', * from TestFeature1
select datalength(id), * from TestFeature1
go