2011-05-02 50 views
0

我需要更新[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不太熟练,并且很欣赏有机会学习。

回答

0
  • 奇怪的是 您可以使用一个未公开的存储过程(请不要告诉莱姆斯Rusanu我说的),做something like this。您将使用@where条件来指定该表必须包含给定的列。

  • 更常规的方法是将

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

老实说,你所用“不可思议的方式”完成的时候,你会是好做它的传统方式,但我只是想彻底。

+0

按照你的建议,我得到错误**必须声明标量变量** **处设置@tablename线**当我执行: 'DECLARE @MyTable如表 ( Table_nm NVARCHAR(128)NULL ) DECLARE @tablename AS NVARCHAR(128) DECLARE @myDynamicSQL AS TEXT = '更新' + @tablename + '设置ISD_ID = 37其中SchoolDistrictID = 46' WHILE(SELECT Table_nm FROM @MyTable )IS NOT NULL BEGIN SET @tablename = [这里我得到错误 - >] @ MyTable.Table_nm 执行立即@myDynamicSQL 继续 END GO' – ElderJedi 2011-05-03 20:21:24

+0

@ SebastianVal - 您应该获取变量中的Table_nm。所以,像这样的东西会起作用:'从@ myTable'选择SELECT 1 @ tablename = table_nm。现在,我还要小心确保您在完成时从@mytable删除记录,或使用计数器来防止无限循环。 – dawebber 2011-06-20 19:39:48

0

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

然后,您可以对保留记录集的变量进行foreach循环 - 然后例如使用一个表达式将SQL Anywhere的"UPDATE " + (DT_STR,255,1252)@[User::tblname] + " SET ....."作为sqlStatementSource进行创建。

+0

(其中User :: tblname是保存作为表名的记录集列的当前值的变量) – cairnz 2011-05-02 21:27:33

+0

感谢您的回复。这似乎是最简单的方法,但我会尝试学习一些新的SQL。 – ElderJedi 2011-05-06 14:02:03

+0

然后,您可以轻松地在查询中使用游标来完成此操作,然后动态执行sql。 – cairnz 2011-05-06 18:09:24