。
请考虑以下设置
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
这就引出了以下两个问题
- 为什么第一个查询有效而第二个查询无效?
- 为什么允许在子句中使用保留关键字而不转义它
where
?
User 是出于某种原因的保留关键字。试试这个:
SELECT User;
对我来说,它返回值为 dbo
的单行。
因此,没有转义user
的查询是完全有效的,它只是不适合您与之比较的值。
根据 MS 文档
不带括号的user
将作为返回数据库用户名的函数工作
如果您使用以下查询进行检查,它将返回记录
SELECT *
FROM #test WHERE user = 'dbo'
当我们使用方括号[]
时,sql 服务器会将用户定义的列名、表名、函数名等视为非保留关键字