Sql server sp_msforeachtable对变量执行操作
我试图弄清楚如何使用sp_msforeachtable对与另一个表中存储的变量/表名匹配的所有表和变量执行操作 即 我有一个表,它有3列:表、变量、操作 我尝试使用sp_MSforeachtable查看哪些表和变量匹配,如果匹配,则在表上执行该操作Sql server sp_msforeachtable对变量执行操作,sql-server,sp-msforeachtable,Sql Server,Sp Msforeachtable,我试图弄清楚如何使用sp_msforeachtable对与另一个表中存储的变量/表名匹配的所有表和变量执行操作 即 我有一个表,它有3列:表、变量、操作 我尝试使用sp_MSforeachtable查看哪些表和变量匹配,如果匹配,则在表上执行该操作 如何在spmsforeachtable语句中调用变量名?我知道怎么用?对于表名,但不确定如果variable name=variable name,则如何表示 是否有其他方法可以在不使用此未记录SP的情况下执行此操作 我会尽量解释清楚: 我正试图从一
名称
电话号码
名字 表
A
A
B 行动
设置为“”
设置为“555-555-5555”
设置为“” 等等 然后我有一个满是表的数据库……在表a上,我希望我的代码设置变量“Name”的所有行
至“”(空白)
,电话号码为“555-555-5555”
等等,然后转到表B,并执行相同的操作,依此类推,我将使用a和: 注意:您尝试执行的操作存在安全问题,因为可以添加到表中的任何人都将拥有与运行脚本的帐户相同的访问权限。通过在另一个只能由管理员编辑的表中定义操作,然后在现有表中引用该操作,可以减少这些问题 注意:最好让@action、@table和@variable的数据类型与其源列匹配。变量可以是数据库中的任何数据类型(只要它不是本地临时类型)。您会注意到,在上面的代码中有两个地方定义了类型,第一个地方是在顶部声明变量,第二个地方是在底部附近的字符串中定义sp_executesql的参数 注意:如果给@stmt和@params分配了一个常量而不是一个变量,请确保在常量前面加上N,这样它将被读取为Unicode字符串。我将使用and: 注意:您尝试执行的操作存在安全问题,因为可以添加到表中的任何人都将拥有与运行脚本的帐户相同的访问权限。通过在另一个只能由管理员编辑的表中定义操作,然后在现有表中引用该操作,可以减少这些问题 注意:最好让@action、@table和@variable的数据类型与其源列匹配。变量可以是数据库中的任何数据类型(只要它不是本地临时类型)。您会注意到,在上面的代码中有两个地方定义了类型,第一个地方是在顶部声明变量,第二个地方是在底部附近的字符串中定义sp_executesql的参数
注意:如果为@stmt和@params分配了一个常量而不是变量,请确保在常量前面加上N,这样它将被读取为Unicode字符串。很可能您可以用另一种方法执行此操作。但是,我们不知道你想做什么,因为这个问题非常模糊。我们试图对我正在做的事情进行一些澄清…虽然不知道为什么我尝试在表格上设置的格式看起来如此糟糕,但在你的原始版本中有足够的细节。我认为最好包括定义表的代码和另一个代码块,以及您正在尝试执行的操作示例。我不确定您希望执行的操作,但我不久前在SPmsforeachTable上写了这篇博文,您可能可以在其中找到解决方案。很可能您可以用另一种方式执行此操作。但是,我们不知道你想做什么,因为这个问题非常模糊。我们试图对我正在做的事情进行一些澄清…虽然不知道为什么我尝试在表格上设置的格式看起来如此糟糕,但在你的原始版本中有足够的细节。我认为最好包括定义表的代码和另一个代码块,并举例说明您正在尝试做什么。我不确定您到底想做什么,但我不久前在SPmsforeachTable上写了这篇博文,您可能可以在其中找到解决方案。感谢您的帮助…我遇到的一个问题,我不确定它是从哪里来的,在这个statmeent中是过程预期参数“@params”,类型为“ntext/nchar/nvarchar”。由于声明的变量是nvarcharSorry,请将脚本中的
@table
类型从sysname
更改为nvarchar(128)
。我将更新代码。我正在尝试,但似乎仍然得到错误,所以我认为可能是来自其他地方,但我会再试一次,谢谢!我更新了代码。您可能正在更改顶部的变量声明,而不是底部附近定义@表sysname的字符串参数。如果您仍然需要帮助,请留下评论,我将开始聊天。因此我创建了一个测试表用作actiontable:create table##test3(actionname nvarchar(max)、tablename nvarchar(128)、variablename nvarchar(max))插入到##test3值中(“set=”、“dbo.ReplicationObject”、“Target”)
谢谢您的帮助…我遇到的一个问题,我不确定它是从哪里来的,在这个状态会议中,是程序需要参数“@params”,类型为“ntext/nchar/nvarchar”。由于声明的变量是nvarcharSorry,请将脚本中的@table
类型从sysname
更改为nvarchar(128)
。我会更新
--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;