当您将多个记录包装在VALUES子句的括号中时,SQL是否将它们视为一个记录?
我最近正在研究一个存储过程,它将多条记录插入到一个表变量中,并遇到了一个看似奇怪的问题,但现在我意识到,我可能只是因为忽略了显而易见的问题而把自己弄糊涂了。无论如何,将表变量定义视为:当您将多个记录包装在VALUES子句的括号中时,SQL是否将它们视为一个记录?,sql,sql-server,Sql,Sql Server,我最近正在研究一个存储过程,它将多条记录插入到一个表变量中,并遇到了一个看似奇怪的问题,但现在我意识到,我可能只是因为忽略了显而易见的问题而把自己弄糊涂了。无论如何,将表变量定义视为: DECLARE @TableVariable TABLE(ID INT NOT NULL PRIMARY KEY IDENTITY(1, 1), SomeValue NVARCHAR(1000)); 当我执行以下insert语句时,它成功了,没有问题: INSERT INTO @TableVariable (S
DECLARE @TableVariable TABLE(ID INT NOT NULL PRIMARY KEY IDENTITY(1, 1), SomeValue NVARCHAR(1000));
当我执行以下insert语句时,它成功了,没有问题:
INSERT INTO @TableVariable (SomeValue) VALUES
('Value 1'), ('Value 2')
然而,当我回来清理查询时,我在VALUES
子句中添加了括号,以便在不添加注释的情况下显示它的结束位置(不知道为什么,可能是C习惯于将区域
标记括起来):
这产生了一个错误,指出INSERT
中的列少于VALUES
子句中的列:
INSERT语句中的列少于values子句中指定的值。values子句中的值数必须与INSERT语句中指定的列数匹配
我的理论是,它将带括号的版本视为试图插入一个值,多个列,因为我将所有条目都包装在括号中
我的问题是,为什么这在官方意义上会有所不同?语法很简单<代码>值后面是一行的值列表。每一行都在它自己的括号内 因此: 是两行一列
values ( (1) ), ( (2) )
是两行一列——事实上与上面相同
但是:
要么是错误。或者,在支持元组的数据库中,一行一列的值为
(1,2)
用您正在使用的数据库标记您的问题。-这应该有助于形象化这个想法。我认为这可能是事实,但我想从一个对SQL有更多经验的人那里100%确定。谢谢我会尽快接受的,所以我会同意的。
values (1), (2)
values ( (1) ), ( (2) )
values ( (1, 2) )