我正在與一個以某種方式將小寫項目編號加載到一系列SQL表中的客戶合作。這在這個特定的應用程序中不應該是可能的,並且會導致各種問題。我着手將這些項目逐一更新爲大寫版本,但很快就意識到這將持續下去。所以我做了不可思議的事情,並試圖用光標來幫助我,但是我一直在困擾着一個讓我感到困惑的錯誤。這裏是我的代碼:用於更新幾個表中幾個列的T-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
您缺少Dynamic-SQL,快速解決方法'EXEC('UPDATE'+ @tablename + 'SET item = upper(item))'' – lad2025