Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:迭代调用过程_Sql_Sql Server - Fatal编程技术网

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也可以参数化,它不是抗注入的,因为它位于存储过程中。。。