sp_msforeachtable对变量执行操作

时间:2016-01-27 17:03:36

标签: sql-server sp-msforeachtable

我试图弄清楚如何使用sp_msforeachtable对所有与存储在另一个表中的变量/表名匹配的表和变量执行操作

IE

我有一个包含3列的表:table,variable,action

我试图使用sp_MSforeachtable来查看哪些表和变量匹配,如果匹配,则在表上执行该操作。

  1. 如何在sp_MSforeachtable语句中调用变量名?我知道用吗?对于表名,但不确定如果变量名=变量名,我会怎么说,然后做X

  2. 有没有其他方法可以在不使用此未记录的SP的情况下执行此操作?

  3. 我试着更好地解释一下:

    我正在尝试从一堆表中清除个人信息...我有一个看起来像这样的表(不知道如何格式化表,所以想象每个条目是一个单独的行,所以第一行是Name ,A,并设置为'')

    变量
     名称
     电话号码
     姓名


    一个
    一个
    B

    动作
    设置为''
    设置为&#; 555-555-5555'
    设置为''

    然后我有一个表格的数据库....在表A上,我希望我的代码设置变量的所有行'名称'
    到'' (空白)
    ,电话号码为' 555-555-5555'
     然后转到表B并执行相同的操作

1 个答案:

答案 0 :(得分:0)

我会使用cursordynamic SQL

--Set up for test:
CREATE TABLE #DataTable (column1 nvarchar(128) NOT NULL, column2 int NOT NULL);     --Create global temp table so it can be accessed from dynamic SQL.
CREATE TABLE ##ActionTable ([table] nvarchar(128) NOT NULL, variable nvarchar(MAX) NOT NULL, [action] nvarchar(MAX) NOT NULL);
INSERT INTO ##ActionTable ([table], variable, [action])
VALUES
    ('#DataTable', '1', 'INSERT INTO @table (column1, column2) VALUES (''@variable_1'', @variable);'),
    ('#DataTable', '2', 'INSERT INTO @table (column1, column2) VALUES (''@variable_1'', @variable);'),
    ('#DataTable', '3', 'INSERT INTO @table (column1, column2) VALUES (''@variable_1'', @variable);'),
    ('#DataTable', '4', 'INSERT INTO @table (column1, column2) VALUES (''@variable_1'', @variable);');

--Code:
DECLARE @action nvarchar(MAX);
DECLARE @table nvarchar(128);
DECLARE @variable nvarchar(MAX);

DECLARE rowCurser CURSOR FOR SELECT [table], variable, [action] FROM ##ActionTable;
OPEN rowCurser;
FETCH rowCurser INTO @table, @variable, @action

WHILE @@FETCH_STATUS = 0
BEGIN
    --Execute the code (pick one of the two.  Option 2 is safer and can be cached (faster), but it does not work with my example because the parameters are left as variables).
    --  Option 1:
    SET @action = REPLACE(REPLACE(@action, '@table', @Table), '@variable', @variable);
    EXECUTE(@action);
    --  Option 2:
    EXECUTE sp_executesql @stmt = N'INSERT INTO #DataTable (column1, column2) VALUES (CAST(@variable as nvarchar(128)) + N''_2'', @variable);', @params = N'@variable nvarchar(MAX)', @variable = @variable;

    --Setup for next iteration
    FETCH rowCurser INTO @table, @variable, @action
END
CLOSE rowCurser;
DEALLOCATE rowCurser;

--Check and cleanup from test
SELECT * FROM #DataTable;
DROP TABLE #DataTable;
DROP TABLE ##ActionTable;

注意:您尝试执行的操作存在安全问题,因为任何可以添加到您的表的人都将拥有与运行该脚本的帐户相同的访问权限。您可以通过在另一个表中定义操作来减少这些问题,这些操作只能由管理员编辑,然后引用现有表中的操作。

注意:最好让@ action,@ table和@variable的数据类型与其源列匹配。变量可以是数据库中的任何数据类型(只要它不是本地临时类型)。您会注意到上面代码中有两个位置定义了类型,第一个是在顶部声明变量,第二个是sp_executesql的参数在底部附近的字符串中定义。

注意:如果@stmt和@params分配了常量而不是变量,请确保将常量前缀为N,以便将其作为Unicode字符串读取。