sp_msforeachtable 对变量执行操作
sp_msforeachtable performing actions on variables
我正在尝试弄清楚如何使用 sp_msforeachtable 对所有 table 和匹配存储在另一个 table 中的 variable/table 名称的变量执行操作=11=]
IE
我有一个包含 3 列的 table:table、变量、操作
我正在尝试使用 sp_MSforeachtable 查看哪些 table 和变量匹配,如果匹配,则在 table.
上执行该操作
sp_MSforeachtable语句中如何调用变量名?我知道用什么?对于 table 名称,但不确定我会怎么说 if variable name=variable name then do X
有没有不使用这个未记录的 SP 的另一种方法?
我会尽力解释得更好:
我正在尝试从一堆 table 中清除个人信息...我有一个 table 看起来像这样(不确定如何格式化 table,所以假设每个条目都是一个单独的行,所以第一行是 Name, A,并设置为 '')
变量
姓名
Phone 数量
姓名
Table
A
A
B
动作
设置为''
设置为“555-555-5555”
设置为 ''
等等
然后我有一个充满 tables 的数据库....在 table A 上,我希望我的代码设置变量 'Name'[=40= 的所有行]
到''(空白)
, 和 Phone 编号为 '555-555-5555'
etc.and 然后转到 table B 并做同样的事情,依此类推
我会使用 cursor and dynamic 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;
注意:您尝试执行的操作存在安全问题,因为任何可以添加到您的 table 的人都将拥有与您的帐户相同的访问权限运行脚本。您可以通过在另一个只能由管理员编辑的 table 中定义操作,然后在现有 table.
中引用操作来减少这些担忧
注意:最好让@action、@table、@variable的数据类型与其源列匹配。变量可以是数据库中的任何数据类型(只要它不是本地临时类型)。您会注意到上面的代码中有两个地方定义了类型,第一个是在顶部声明变量的地方,第二个是 sp_executesql 的参数在靠近底部的字符串中定义的地方。
注意: 如果@stmt 和@params 被赋值给常量而不是变量,请确保在常量前加上 N 前缀,以便将其作为 Unicode 字符串读取.
我正在尝试弄清楚如何使用 sp_msforeachtable 对所有 table 和匹配存储在另一个 table 中的 variable/table 名称的变量执行操作=11=]
IE
我有一个包含 3 列的 table:table、变量、操作
我正在尝试使用 sp_MSforeachtable 查看哪些 table 和变量匹配,如果匹配,则在 table.
上执行该操作sp_MSforeachtable语句中如何调用变量名?我知道用什么?对于 table 名称,但不确定我会怎么说 if variable name=variable name then do X
有没有不使用这个未记录的 SP 的另一种方法?
我会尽力解释得更好:
我正在尝试从一堆 table 中清除个人信息...我有一个 table 看起来像这样(不确定如何格式化 table,所以假设每个条目都是一个单独的行,所以第一行是 Name, A,并设置为 '')
变量
姓名
Phone 数量
姓名
Table
A
A
B
动作
设置为''
设置为“555-555-5555”
设置为 ''
等等
然后我有一个充满 tables 的数据库....在 table A 上,我希望我的代码设置变量 'Name'[=40= 的所有行]
到''(空白)
, 和 Phone 编号为 '555-555-5555'
etc.and 然后转到 table B 并做同样的事情,依此类推
我会使用 cursor and dynamic 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;
注意:您尝试执行的操作存在安全问题,因为任何可以添加到您的 table 的人都将拥有与您的帐户相同的访问权限运行脚本。您可以通过在另一个只能由管理员编辑的 table 中定义操作,然后在现有 table.
中引用操作来减少这些担忧注意:最好让@action、@table、@variable的数据类型与其源列匹配。变量可以是数据库中的任何数据类型(只要它不是本地临时类型)。您会注意到上面的代码中有两个地方定义了类型,第一个是在顶部声明变量的地方,第二个是 sp_executesql 的参数在靠近底部的字符串中定义的地方。
注意: 如果@stmt 和@params 被赋值给常量而不是变量,请确保在常量前加上 N 前缀,以便将其作为 Unicode 字符串读取.