Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum sollte die SqlServer select-Anweisung Zeilen auswählen, die übereinstimmen, und Zeilen, die übereinstimmen und nachgestellte Leerzeichen haben?

Um meine Antwort zu überarbeiten, ist LEN() unsicher, um ANSI_PADDING zu testen, da es definiert ist, um die Länge ohne nachgestellte Leerzeichen zurückzugeben, und DATALENGTH() ist vorzuziehen, wie AdaTheDev sagt.

Interessant ist, dass ANSI_PADDING eine Einfügungszeiteinstellung ist und dass sie für VARCHAR berücksichtigt wird, aber nicht für NVARCHAR.

Zweitens, wenn eine Spalte mit nachgestellten Leerzeichen zurückgegeben wird oder das '=' für Gleichheit verwendet wird, scheint es eine implizite Kürzung des nachgestellten Leerzeichens zu geben.

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