gpt4 book ai didi

sql-server - T-SQL 游标更新多个表中的多个列

转载 作者:行者123 更新时间:2023-12-03 09:39:19 24 4
gpt4 key购买 nike

我正在与一位客户合作,该客户以某种方式将小写商品编号加载到一系列 SQL 表中。这在这个特定的应用程序中是不可能的,并且会导致各种问题。我打算一次将项目更新为大写版本,但很快意识到这需要永远。所以我做了一件不可思议的事情,并尝试使用光标来帮助我,但是我一直被一个让我困惑的错误绊倒。这是我的代码:

declare @tablename varchar(10)

declare upper_case cursor for
SELECT sys.objects.NAME
FROM sys.columns
INNER JOIN sys.objects ON sys.columns.object_id = sys.objects.object_id
WHERE sys.columns.NAME = 'item'
AND sys.objects.type = 'U'

OPEN upper_case
FETCH NEXT FROM upper_case into @tablename

UPDATE @tablename
SET item = upper(item)

CLOSE upper_case
DEALLOCATE upper_case

这里是错误:

Msg 1087, Level 16, State 1, Line 13
Must declare the table variable "@tablename".

我没有将 @tablename 用作表变量,我试图将它用作标量变量,但我想,管它呢,我会坚持下去。所以我将它切换为一个表变量:

declare @tablename table (tablename varchar(10))

然后我得到这个错误:

Msg 137, Level 16, State 1, Line 5
Must declare the scalar variable "@tablename".

我错过了什么?是否不允许在 UPDATE 语句中使用变量?我知道每个 UPDATE 只能更新一个表,但我认为通过使用游标,我有效地发出多个更新,每个更新只更新一个表。我误解了吗?

这是有效的结果。我不敢相信我是第一个想要这样做的人,我怀疑我会是最后一个:

DECLARE @tablename varchar(10)
DECLARE @sql nvarchar(max)

declare upper_case cursor for
SELECT sys.objects.NAME
FROM sys.columns
INNER JOIN sys.objects ON sys.columns.object_id = sys.objects.object_id
WHERE sys.columns.NAME = 'item'
AND sys.objects.type = 'U'

OPEN upper_case
FETCH upper_case into @tablename

WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'UPDATE [' + @tablename + '] SET item = upper(item)'
EXEC(@sql)

FETCH upper_case into @tablename
END

CLOSE upper_case
DEALLOCATE upper_case

最佳答案

UPDATE你不能像你尝试的那样将表名作为变量传递:

UPDATE @tablename
SET item = upper(item);

Msg 1087, Level 16, State 1, Line 13 Must declare the table variable "@tablename"

但是 UPDATE 可以使用表变量 DECLARE @t TABLE = ...(不是你的情况)。

要按您希望的方式使用它,您需要 Dynamic-SQL,例如:

EXEC('UPDATE [' + @tablename + '] SET item = UPPER(item)');

关于sql-server - T-SQL 游标更新多个表中的多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32492477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com