Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi l'instruction select de SqlServer sélectionnerait-elle les lignes qui correspondent et les lignes qui correspondent et ont des espaces de fin

Pour retravailler ma réponse, LEN() n'est pas sûr pour tester ANSI_PADDING car il est défini pour renvoyer la longueur à l'exclusion des espaces de fin, et DATALENGTH() est préférable comme le dit AdaTheDev.

Ce qui est intéressant, c'est que ANSI_PADDING est un paramètre de temps d'insertion, et qu'il est honoré pour VARCHAR mais pas pour NVARCHAR.

Deuxièmement, si vous renvoyez une colonne avec des espaces de fin ou si vous utilisez le '=' pour l'égalité, il semble y avoir une troncature implicite de l'espace de fin qui se produit.

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