MS SQL:抑制存储过程中调用的存储过程的返回值
我想我遇到了与kcrumley在问题“Problem calling stored procedure from another stored procedure via classic ASP”中描述的相同的问题。但是他的问题并没有真正包括解决方案,所以我给它一个镜头,加上我自己的观察:MS SQL:抑制存储过程中调用的存储过程的返回值
我有两个存储过程:
CREATE PROCEDURE return_1 AS BEGIN
SET NOCOUNT ON;
SELECT 1
END
CREATE PROCEDURE call_return_1_and_return_2 AS BEGIN
SET NOCOUNT ON;
EXEC return_1
SELECT 2
END
注意,这两个程序包含“SET NOCOUNT ON ”。当我执行“call_return_1_and_return_2”时,我仍然得到两个记录集。首先是值1,然后是值2.
这会导致ASP(经典的VBScript ASP)离开轨道。
任何提示我如何能抑制第一个结果集?为什么即使使用NOCOUNT,它也存在?
跳过ASP中的第一个记录集不是一个选项。我需要一个“仅数据库”解决方案。
它不是导致这种情况的NOCOUNT,您的存储过程每个都有一个选择,因此每个都有自己的结果集。这可以通过更改第一个存储过程以避免使用输出参数将数字1传回而不是执行选择来避免。第二个存储过程可以检查输出参数以获取运行所需的数据。
尝试这样的事情
CREATE PROCEDURE Proc1
(
@RetVal INT OUTPUT
)
AS
SET NOCOUNT ON
SET @RetVal = 1
CREATE PROCEDURE Proc2
AS
SET NOCOUNT ON
DECLARE @RetVal int
EXEC [dbo].[Proc1]
@RetVal = @RetVal OUTPUT
SELECT @RetVal as N'@RetVal'
那些不返回变量,但输出记录集。我猜,只要SQL服务器将输出刷新到客户端,就会被搞砸,无法收回。
我会通过向SP return_1添加一个参数来解决这个问题,这将控制return_1是否选择记录或者只是执行某些操作并以静默方式退出。
正如马特在他的评论中指出的那样,这两种解决方案都不能真正“吞下”第一个结果集。 我不知道你为什么想要这个,但是你可以通过使用一个表变量'吞下'第一个exec的结果。它必须匹配结果集列的确切数量和类型。像这样:
CREATE PROCEDURE return_1 AS
SET NOCOUNT ON;
SELECT 1
GO
CREATE PROCEDURE call_return_1_and_return_2 AS
SET NOCOUNT ON;
DECLARE @Result TABLE (res int)
insert into @Result EXEC return_1
SELECT 2
GO
一对夫妇的响应指出,可以从选择更改来一回,但是这是一个很大的问题 - 如果嵌套的存储过程必须选择,因为别的东西的话来说,你不能改变它?我想知道是否有可能“吞下”这样的结果集。 – 2009-03-03 11:34:41