SQL Server:迭代调用过程
我有一个存储过程,用于计算某些内容。我想用不同的参数多次调用这个过程,并将所有内容插入到一个表中。调用此过程是我想要自动化的 假设我有两个表,一个表有一些名字,第二个表有姓氏。我想交叉连接这两个表,以获得所有可能的名字和姓氏组合。然后我想为联接表的每一行调用我的过程SQL Server:迭代调用过程,sql,sql-server,Sql,Sql Server,我有一个存储过程,用于计算某些内容。我想用不同的参数多次调用这个过程,并将所有内容插入到一个表中。调用此过程是我想要自动化的 假设我有两个表,一个表有一些名字,第二个表有姓氏。我想交叉连接这两个表,以获得所有可能的名字和姓氏组合。然后我想为联接表的每一行调用我的过程 CREATE TABLE #FN ( FirstName varchar(255), ); CREATE TABLE #LN ( LastName varchar(255), ); INSERT INTO #
CREATE TABLE #FN
(
FirstName varchar(255),
);
CREATE TABLE #LN
(
LastName varchar(255),
);
INSERT INTO #FN VALUES ('Augustinus'), ('Blepharo'), ('Gripus')
INSERT INTO #LN VALUES ('Sylla'), ('Petreius'), ('Cerinthus')
SELECT *
INTO #NAMES
FROM #FN
CROSS JOIN #LN
现在我需要自动执行以下代码,从名称中逐行执行,而不是手动键入参数
CREATE TABLE #RESULT (Val VARCHAR(10))
INSERT INTO #RESULT
EXEC('EXEC #myprocedure @arg1=''Augustinus'', @arg2=''Sylla'';
EXEC #myprocedure @arg1=''Augustinus'', @arg2=''Petreius'';
...')
您可以使用select查询逐个记录生成动态执行存储过程
请检查下面的代码以获取您的答案
CREATE TABLE #FN (
FirstName varchar(255),
);
CREATE TABLE #LN (
LastName varchar(255),
);
INSERT INTO #FN VALUES ('Augustinus'),('Blepharo'),('Gripus')
INSERT INTO #LN VALUES ('Sylla'),('Petreius'),('Cerinthus')
SELECT * INTO #NAMES FROM #FN CROSS JOIN #LN
SELECT * FROM #NAMES
CREATE TABLE #RESULT (Val VARCHAR(1000))
INSERT INTO #RESULT(Val)
SELECT
'EXEC #myprocedure @arg1=''' + N.FirstName + ''', @arg2=''' + N.LastName + ''';' AS [Value]
FROM #NAMES N;
SELECT Val FROM #RESULT;
DROP TABLE #FN;
DROP TABLE #LN;
DROP TABLE #NAMES;
DROP TABLE #RESULT;
这是一次性的事情还是你会经常这样做?@CaiusJard不是一次性的事情,将来会被任意调用多次。你的查询本质上是这个查询的重复--阅读一下它,看看你是否会因为你的情况而无法转换它的建议?这是游标的一个用例。的确,虽然也有一些不提及“游标”的方法,比如从临时表中选择最上面的行作为变量,执行过程,从临时表中删除行,重复直到表为空。。但这是一种有点肮脏的方式来模拟你需要光标的目的,只是为了安抚一些“你永远不会说出光标这个词”dba:Ermmm。。那么这实际上在哪里执行这个过程呢?当它处理Shamus O'Leary时呢?动态sql也可以参数化,它不是抗注入的,因为它位于存储过程中。。。