我最近在研究一个存储过程,该过程将多条记录插入到一个表变量中,并遇到了一个看似奇怪的问题,但现在我意识到,我可能只是因为忽略了显而易见的问题而混淆了自己。无论如何,将表变量定义为:
DECLARE @TableVariable TABLE(ID INT NOT NULL PRIMARY KEY IDENTITY(1, 1), SomeValue NVARCHAR(1000));
当我执行以下插入语句时,它成功了,没有出现任何问题:
INSERT INTO @TableVariable (SomeValue) VALUES
('Value 1'), ('Value 2')
然而,当我回来清理查询时,我在VALUES
子句中添加了括号,试图在不添加注释的情况下显示它的结束位置(不知道为什么,可能是C#中包装#region
标签的习惯(:
INSERT INTO @TableVariable (SomeValue) VALUES (
('Value 1'), ('Value 2')
);
这产生了一个错误,指出INSERT
中的列比VALUES
子句中的列少:
INSERT语句中的列数少于values子句中指定的值。values子句中的值数必须与INSERT语句中指定的列数相匹配。
我的理论是,它将带括号的版本视为插入单个值的尝试,因为我将所有条目都包装在括号中。
我的问题是,为什么正式会产生影响?
语法很简单。VALUES
后面是一行的值列表。每一行都在自己的一组括号内。
因此:
values (1), (2)
是两行一列。
values ( (1) ), ( (2) )
是两行一列——事实上与上面相同。
但是:
values ( (1, 2) )
要么是错误。或者在支持元组的数据库中,一行一列的值为(1, 2)
。