当您在VALUES子句中将多条记录括在括号中时,SQL是否将它们视为一条记录



我最近在研究一个存储过程,该过程将多条记录插入到一个表变量中,并遇到了一个看似奇怪的问题,但现在我意识到,我可能只是因为忽略了显而易见的问题而混淆了自己。无论如何,将表变量定义为:

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)

最新更新