sql >> Databasteknik >  >> RDS >> Sqlserver

Varför skulle SqlServer välja uttalande välja rader som matchar och rader som matchar och har efterföljande mellanslag

För att omarbeta mitt svar är LEN() osäker att testa ANSI_PADDING eftersom det är definierat att returnera längden exklusive efterföljande mellanslag, och DATALENGTH() är att föredra som AdaTheDev säger.

Det som är intressant är att ANSI_PADDING är en insättningstid för insättning och att den är hedrad för VARCHAR men inte för NVARCHAR.

För det andra, om man returnerar en kolumn med efterföljande mellanslag, eller använder '=' för jämlikhet, verkar det vara en implicit trunkering av efterföljande mellanslag som inträffar.

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


  1. SQL Server:Ersätt ogiltiga XML-tecken från ett VARCHAR(MAX)-fält

  2. Hur använder jag grupp efter med tre kolumner med data?

  3. Sammanfoga bord med främmande nycklar

  4. Vad är den korrekta syntaxen för en Regex hitta-och-ersätt med REGEXP_REPLACE i MariaDB?