Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tại sao câu lệnh select của SqlServer lại chọn các hàng phù hợp và các hàng phù hợp và có dấu cách ở cuối

Để làm lại câu trả lời của tôi, LEN () không an toàn để kiểm tra ANSI_PADDING vì nó được xác định để trả về độ dài không bao gồm dấu cách ở cuối và DATALENGTH () thích hợp hơn như AdaTheDev nói.

Điều thú vị là ANSI_PADDING là cài đặt thời gian chèn và nó được tôn trọng cho VARCHAR nhưng không dành cho NVARCHAR.

Thứ hai, nếu trả về một cột có dấu cách ở cuối hoặc sử dụng '=' cho bằng nhau, thì dường như có một sự cắt ngắn ngầm của dấu cách ở cuối.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. OPENROWSET với tệp Excel

  2. Pyodbc:Lỗi hết thời gian đăng nhập

  3. Thay đổi mật khẩu cho đăng nhập máy chủ SQL

  4. Tại sao tôi không thể sử dụng bí danh trong câu lệnh DELETE?

  5. SQL Server thoát một gạch dưới