我想循环一个表列表。对于每个表,我想运行更新查询。
Psuedo代码:
ArrayOfTablesObjects = {['tablename1','fieldname1'],['tablename2','fieldname2']......}
foreach @tablename in ArrayOfTablesObjects
UPDATE @tablename
SET @fieldname = 'xyz'
WHERE @fieldname = '123'
end foreach
答案 0 :(得分:2)
您需要为此使用动态SQL。 EXEC函数将执行以字符串形式传入的ad-hoc sql语句。
DECLARE @UpdateSql AS varchar(2000)
foreach @tablename in ArrayOfTablesObjects
SET @UpdateSql = 'UPDATE ' + @tablename + ' SET ' + @fieldname ' + = ''xyz'' WHERE ' + @fieldname + ' = ''123'''
EXEC (@UpdateSql)
end foreach
答案 1 :(得分:2)
这只能使用动态SQL来完成。这是一个非常危险的技术,如果不考虑它如何损害数据库以及如何更仔细地编写以保护数据库,就不应该这么做。在考虑编写动态SQL之前,请阅读本文。 http://www.sommarskog.se/dynamic_sql.html
答案 2 :(得分:0)
感谢Harpo的回答。我用这个想法来构建以下sql语句。我们有许多表50+都具有相同类型的数据(员工ID),但该字段名称可能不同。因此,根据表名,要更新的字段将有所不同。我的实际WHERE和SET语句比这个例子更复杂,但这对这个问题并不重要。
我首先创建一个临时表来存储我想要更新的表/字段。
然后我循环遍历这些记录,并生成SQL。对于那些不喜欢动态sql的人,你可以使用print语句,然后将其粘贴到另一个查询窗口并执行它。或者你可以打电话给EXEC声明。
我想接受你的答案,但后来没有完全回答我的问题,部分是因为我没有完全解释自己。无论哪种方式,谢谢你的帮助。
DECLARE @TableFieldDictionary TABLE
(
tablename VARCHAR(100),
fieldname varchar(100)
)
insert into @TableFieldDictionary(tablename,fieldname) values ('table1','field1');
insert into @TableFieldDictionary(tablename,fieldname) values ('table2','field2');
--put more insert statements here. In my case, I have 50 inserts
declare cursor_dictionary cursor
for select tablename, fieldname from @TableFieldDictionary
open cursor_dictionary
declare @looptablename VARCHAR(100)
declare @loopfieldname varchar(100)
fetch next from cursor_dictionary
into @looptablename,@loopfieldname
DECLARE @UpdateSql AS varchar(max)
WHILE @@FETCH_STATUS = 0
BEGIN
SET @UpdateSql = 'UPDATE ' + @looptablename +
' SET ' + @loopfieldname + ' = 123' +
' WHERE ' + @loopfieldname + ' = 456'
print @updatesql
--EXEC(@updatesql)
fetch next from cursor_dictionary
into @looptablename,@loopfieldname
END
CLOSE cursor_dictionary
DEALLOCATE cursor_dictionary