0

我有一个存储过程,它根据成功或失败返回两个结果集。

SP 成功结果集:name, id ,error,desc
SP 失败结果 sret: error,desc

我正在使用以下查询来获取存储过程的结果。成功返回 0,失败返回 -1。

declare @ret int

DECLARE @tmp TABLE (
     name  char(70),
     id    int,
     error char(2),
     desc  varchar(30)
)

insert into @tmp
EXEC @ret  = sptest '100','King'

select @ret

select * from @tmp

如果 SP 成功,则四个字段将被插入到临时表中,因为列匹配。但是在失败的情况下,sp结果集只有错误和desc与临时表中的列不匹配......我无法更改Sp,所以我需要做一些事情(不确定)临时表来处理失败和成功。

4

4 回答 4

1

您不能返回 2 个不同的记录集并加载同一个临时表。两者都不能尝试填写 2 个不同的表格。

有 2 个选项。

  1. 修改你的存储过程

    • 在所有条件下返回所有 4 列
    • 第一对 (name, ID) 列在错误时为 NULL
    • 第二对(错误,描述)成功时为 NULL
  2. 如果您使用的是 SQL Server 2005,则使用 TRY/CATCH 分隔成功和失败代码路径。下面的代码依赖于使用新的错误处理通过异常/RAISERROR 传回错误结果集。

例子:

CREATE PROC sptest
AS
DECLARE @errmsg varchar(2000)

BEGIN TRY
   do stuff
   SELECT col1, col2, col3, col4 FROM table etc
   --do more stuff
END TRY
BEGIN CATCH
   SELECT @errmsg = ERROR_MESSAGE()
   RAISERROR ('Oops! %s', 16, 1, @errmsg)
END CATCH
GO

DECLARE @tmp TABLE ( name CHAR(70), id INT, error char(2), desc varchar(30)

BEGIN TRY
    insert into @tmp
    EXEC sptest '100','King'
    select * from @tmp
END TRY
BEGIN CATCH
   PRINT ERROR_MESSAGE()
END CATCH
于 2009-04-12T10:25:00.940 回答
0

你不能只用一个电话来做到这一点。您必须调用它一次,或者获取返回状态,然后根据状态分支到 INSERT..EXEC 命令,该命令将适用于将返回的列数,或者调用一次,假设成功,使用 TRY。 .CATCH,然后在 Catch 中再次调用它,假设它会失败(这就是它到达 CATCH 的方式)。

更好的是,要么重写存储过程,使其返回一致的列集,要么编写您自己的存储过程、表值函数或查询,方法是从该存储过程中提取代码并使其适应您的使用. 这是 SQL 中的正确答案。

于 2009-05-28T00:41:17.177 回答
0

我的错!!回答得太快了。您只需要对返回值进行 relv,因此针对它构建逻辑要好得多。

如果您仍然想使用临时表,那么两次调用 sptest 可能是一种处理它的方法(虽然不是最佳的),一次获取返回值并基于它然后有 2 个不同的临时表要填充(一个是 4 个字段,另一个只有 2 个字段)。

declare @ret int

DECLARE @tmp TABLE (name CHAR(70), id INT, error char(2), desc varchar(30))
DECLARE @tmperror TABLE (error char(2), desc varchar(30))


EXEC @ret = sptest '100','King'

IF @ret != 0
BEGIN
  INSERT INTO @tmperror
  EXEC sptest '100','King';
  SELECT * FROM @tmperror;
END
ELSE
BEGIN
  INSERT INTO @tmp
  EXEC sptest '100','King';
  SELECT * FROM @tmp;
END

请记住,此解决方案不是最佳的。

于 2009-04-12T09:35:50.870 回答
0

尝试修改表定义,使前两列可以为空:

DECLARE @tmp TABLE (
 name  char(70) null,
 id    int null,
 error char(2),
 desc  varchar(30)

)

希望这可以帮助,

账单

于 2009-05-23T06:56:38.460 回答