Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que a instrução select do SqlServer selecionaria as linhas que correspondem e as linhas que correspondem e têm espaços à direita


Para retrabalhar minha resposta, LEN() não é seguro para testar ANSI_PADDING, pois é definido para retornar o comprimento excluindo espaços à direita, e DATALENGTH() é preferível, como diz AdaTheDev.

O que é interessante é que ANSI_PADDING é uma configuração de tempo de inserção e que é respeitada para VARCHAR, mas não para NVARCHAR.

Em segundo lugar, se retornar uma coluna com espaços à direita ou usar o '=' para igualdade, parece haver um truncamento implícito do espaço à direita que ocorre.
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