更新多个表中的记录属性

时间:2011-05-02 20:48:39

标签: sql tsql ssis for-loop dynamic-sql

我需要更新[ISD_ID]属性的不同表中的选择事件,我该如何实现?

我可以使用此声明获取拥有我正在寻找的记录的表集:

SELECT c1.TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS c1
INNER JOIN information_schema.COLUMNS c2
ON c1.TABLE_NAME = c2.TABLE_NAME
 WHERE c1.COLUMN_NAME LIKE '%isd%id%' and c2.column_name LIKE '%schooldistrict%id%'

所以现在我有一组表名,我想迭代,根据需要更新记录。

根据另一篇文章的建议,我已经阅读了动态SQL。所以我可以做EXECUTE IMMEDIATE: ('update' + @tablename + ' set ISD_ID=37 where SchoolDistrictID=46')

之类的事情

我的问题是:如何迭代我的表名并将它们替换为上述语句作为@tablename变量,以便我可以更新每个表中的值?

如果需要,我也可以使用.NET和SSIS。

提前致谢;我不太熟悉SQL,并且很高兴有机会学习。

2 个答案:

答案 0 :(得分:0)

  • 一种奇怪的方式 您可以使用未记录的存储过程(请不要告诉Remus Rusanu我说过),something like this。您可以使用@where条件指定表必须包含给定列。

  • 更传统的方式是

    1. 将查询结果选择为临时表或表变量
    2. 迭代临时表/表变量,使用while循环,获取表名并替换为@tablename变量
    3. 执行上面的查询。警告,您可能想要创建一个名为@myDynamicSQL的变量,将语句文本设置为它,然后在其上调用EXEC IMMEDIATE。

老实说,当你以“奇怪的方式”完成时,你最好以传统的方式做到这一点,但我只是想彻底。

答案 1 :(得分:0)

如果要为此使用SSIS,可以将第一个查询的结果带入RecordSet目标。

然后,您可以在保留记录集的变量上创建一个foreach循环 - 然后例如创建一个带有表达式的SQL任务,该表达式将您的"UPDATE " + (DT_STR,255,1252)@[User::tblname] + " SET ....."作为sqlStatementSource。