尝试在 SQL 中运行 UPDATE 语句时“必须声明标量变量”

Posted

技术标签:

【中文标题】尝试在 SQL 中运行 UPDATE 语句时“必须声明标量变量”【英文标题】:"Must declare the scalar variable" when trying to run UPDATE statement in SQL 【发布时间】:2018-04-06 16:26:50 【问题描述】:

尝试使用两个表变量(@NameZip@NameZip2)更新两个表(CityLocation)。城市名称有ZipCodesZipCodesNames,反之亦然。更新正在更改输入错误的城市名称和邮政编码。但得到错误:

消息 137,第 16 层,状态 1,第 28 行 必须声明标量变量“@NameZip2”。

消息 137,第 16 级,状态 1,第 32 行 必须声明标量变量“@NameZip”。

我写的查询:

--first table variable
DECLARE @NameZip TABLE 
                 (
                     Zip_Code NVARCHAR(100),
                     Name NVARCHAR(100),
                     id_city INT
                 )

--second table variable
DECLARE @NameZip2 TABLE
                  (
                      Zip_Code nvarchar(100),
                      Name NVARCHAR(100),
                      id_city INT
                  )

--inserting into first table variable from City and Location table
INSERT INTO @NameZip (Zip_code, Name, id_city)
    SELECT B.Zip_Code, A.Name, A.id_city
    FROM City A 
    INNER JOIN Location B ON A.id_city = B.id_city 
                          AND Name NOT LIKE '%[^0-9]%'

--inserting into second table variable from first table variable
INSERT INTO @NameZip2(Zip_code, Name, id_city)
    SELECT Name, Zip_Code, id_city
    FROM @NameZip

UPDATE City 
SET Name = (SELECT Name FROM @NameZip2)
WHERE City.id_city = @NameZip2.id_city -- I get error on this line

UPDATE Location
SET Zip_Code = (SELECT Zip_Code FROM @NameZip2)
WHERE Zip_Code = @NameZip.Zip_Code -- I get error on this line

我们将不胜感激。

【问题讨论】:

【参考方案1】:

使用update from join 语法

update c
set Name = z.Name 
from City C
inner join @NameZip2 z on c.id_city =z.id_city 

location 表更新也执行相同操作。

【讨论】:

【参考方案2】:

您想通过连接来执行此操作...但实际上并不需要您的表变量。

update c
set c.Name = n.Name
from City c
inner join @NameZip2 n on n.id_city = c.id_city

update L
set L.Zip_Code = n.Zip_Code
from Location L
inner join
@NameZip2 n on n.Zip_Code = L.Zip_Code

可以写成……

update c
set c.Name = n.Name, c.Zip_Code = n.Zip_Code
from City c
inner join    
    (SELECT B.Zip_Code, A.Name, A.id_city
    FROM City A 
    INNER JOIN Location B ON A.id_city = B.id_city 
                          AND Name NOT LIKE '%[^0-9]%') n

【讨论】:

我明白你的意思,先生。很抱歉将我的答案标记为正确的答案。我接受这个答案,因为它显示了另一种有效的解决方案。感谢您的想法! 不需要给我打电话,先生或道歉好伙伴。我只是困惑@schikkamksu【参考方案3】:

虽然其他答案可以帮助您更改代码,但我认为解释代码有什么问题很有趣:

SET Name = (SELECT Name FROM @NameZip2)

此行可能会给您一个错误。如果您使用= 运算符,您必须确保表达式将只返回一个值。即使你是对的,@NameZip2 只有一条记录,这不是一个好方法,你可以这样做:

SET Name = (SELECT Top 1 Name FROM @NameZip2)

还有这一行:

WHERE Zip_Code = @NameZip.Zip_Code

因为@NameZip 是一个表,所以无法使用,您应该使用SELECT 命令而不是=,这样:

WHERE Zip_Code = (SELECT TOP 1 Zip_Code FROM @NameZip)

【讨论】:

继续 Ricardo 的想法,原始代码中的点表示法让我觉得您正在尝试将表变量视为数组。这并非不合理,但 SQL Server 不允许您这样做。 :)

以上是关于尝试在 SQL 中运行 UPDATE 语句时“必须声明标量变量”的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句update中的where条件的用法问题

SQL中使用UPDATE更新数据时一定要记得WHERE子句

SQL的update语句中,可以让要update的表里的数据与另外的一个表里的数据进行运算吗

Access 中 SQL 链接表上的 UPDATE 查询的“操作必须使用可更新查询”

MS T-SQL UPDATE语句

SQL Server - 优化UPDATE语句的执行