То, что вы пытаетесь сделать, называется «динамический SQL». Пока вы на правильном пути, вы не можете просто вставить переменную вместо имени объекта и выполнить запрос. Я оставлю ловушки динамического SQL кому-то еще. То, что вы ищете, это:
DECLARE @tblName varchar(50)
DECLARE process_cursor CURSOR FOR
SELECT source
FROM tmpTableNames
OPEN process_cursor
FETCH NEXT FROM processcursor
INTO @tblName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @sql NVARCHAR(500)
SELECT @sql = 'UPDATE [' + @tbleName + '] SET itemid = r.itemid FROM [' + @tbleName + '] v, itemref r WHERE r.ilditemid = v.itemid'
EXEC sp_executesql @sql
FETCH NEXT FROM process_cursor
INTO @tblName
END
CLOSE processcursor
DEALLOCATE processcursor
Это превращает ваш запрос на обновление в строку, а затем передает SQL, содержащийся в этой строке, в хранимую процедуру sp_executesql
(это рекомендуемый способ выполнения динамического sql, а не EXEC('foo')
).