Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 Server_Sql Server 2005_Stored Procedures - Fatal编程技术网

Sql server 从另一个存储过程调用的存储过程中获取第一个结果集

Sql server 从另一个存储过程调用的存储过程中获取第一个结果集,sql-server,sql-server-2005,stored-procedures,Sql Server,Sql Server 2005,Stored Procedures,我有一个SQLServer2005存储过程,它返回两个模式不同的结果集 另一个存储过程将其作为Insert Exec执行。但是,我需要插入第一个结果集,而不是最后一个。这样做的方法是什么 我可以创建一个新的存储过程,它是第一个存储过程的副本,第一个存储过程只返回我想要的结果集,但我想知道我是否可以使用现有的一个存储过程,该存储过程返回两个结果集。是否有令人信服的理由让第一个存储过程只返回一个结果集?通常,您应该避免让一个存储过程同时执行INSERT和SELECT(如果SELECT是为了获取新创建

我有一个SQLServer2005存储过程,它返回两个模式不同的结果集

另一个存储过程将其作为Insert Exec执行。但是,我需要插入第一个结果集,而不是最后一个。这样做的方法是什么


我可以创建一个新的存储过程,它是第一个存储过程的副本,第一个存储过程只返回我想要的结果集,但我想知道我是否可以使用现有的一个存储过程,该存储过程返回两个结果集。

是否有令人信服的理由让第一个存储过程只返回一个结果集?通常,您应该避免让一个存储过程同时执行INSERT和SELECT(如果SELECT是为了获取新创建的行的标识,则例外)。

实际上,INSERT..EXEC将尝试将这两个数据集插入表中。如果列计数匹配,并且数据类型可以隐式转换,那么实际上您将同时获得这两个值

否则,它将始终失败,因为无法仅获取其中一个结果集

此问题的解决方案是从被调用过程中提取所需的功能,并将其合并到(以前的)调用过程中。同时提醒自己“SQL不像客户机代码:冗余代码比冗余数据更容易接受”

如果上述情况不清楚,让我描述一下在这种情况下任何人都可以选择的事实和选项:

1) 如果返回的两个结果集是兼容的,则可以使用INSERT将这两个结果集放在同一个表中,并尝试删除不需要的结果集

2) 如果两个结果集不兼容,则INSERT..EXEC无法正常工作

3) 您可以将代码从被调用的过程中复制出来,并在调用者中重新使用,还可以处理双重编辑维护的成本

4) 您可以更改被调用的过程,使其与其他过程更加兼容


就这样。这些是您在T-SQL中针对这种情况的选择。您可以使用SQLCLR或客户端代码使用一些额外的技巧,但它们将涉及到稍微不同的操作。

Oo为了防止两个进程之间的代码不同步,为什么不编写一个程序来执行插入所需的操作,在您的流程中调用它,并让原始进程调用它来获取第一个记录集,然后执行它需要执行的任何其他操作


根据选择的方式,可能会将其重构为表值函数,而不是两个进程都将调用的过程。

第一个存储过程是现有的,并且已经在生产中。至于你提到的规则,sproc做任何它需要做的事情都没有错。在一个存储过程中多次插入和选择是非常常见的。你没有解释缺点是什么。我知道这一点,就像我说的,两个结果集都有模式。因此,不能将两者插入到同一个表中。我需要按照我解释的方式来做,这样如果有人修改了第一个进程,第二个进程就会自动获得第一个进程返回的正确数据。复制sql不是一个好主意,因为这样开发人员就必须同时修改这两个sql,开发人员就会错过依赖关系。这不是一个冗余数据案例。这是不好的冗余代码。请重新阅读我的答案,你提到的所有内容都包含在这里:1)你不能只获得其中一个集合,2)它们必须是相同的模式才能获得这两个集合,3)没有办法解决这一问题,4)你最好的选择是复制代码。唯一的另一种选择是将调用的过程更改为更兼容的过程。这些是你唯一的选择。很抱歉,SQL就是这样工作的。原始进程不能也不应该为此而更改。这是一个复杂的过程,不应该仅仅因为另一个进程需要相同的数据就去碰它。我不想复制代码的原因是因为它有一英里长,如果我可以在我的proc中用一条语句调用它会非常方便。如果有什么问题的话,我必须想出一个解决方案,在不修改的情况下重用它