where 子句中的保留关键字



请考虑以下设置

create table #test([user] varchar(10))
insert into #test([user]) values ('test')

user列用方括号括起来时,查询返回结果,否则即使有匹配的记录,它也不会返回结果

SELECT *
FROM   #test WHERE [user] = 'test' -- returns record
SELECT *
FROM   #test WHERE user = 'test' --did not return record

这就引出了以下两个问题

  1. 为什么第一个查询有效而第二个查询无效?
  2. 为什么允许在子句中使用保留关键字而不转义它where

User 是出于某种原因的保留关键字。试试这个:

SELECT User;

对我来说,它返回值为 dbo 的单行。

因此,没有转义user的查询是完全有效的,它只是不适合您与之比较的值。

根据 MS 文档

不带括号的user将作为返回数据库用户名的函数工作

如果您使用以下查询进行检查,它将返回记录

SELECT *
FROM   #test WHERE user = 'dbo'

当我们使用方括号[]时,sql 服务器会将用户定义的列名、表名、函数名等视为非保留关键字

最新更新