sql-server 尝试从存储过程读取返回值时始终显示0

acruukt9  于 2022-10-31  发布在  其他
关注(0)|答案(2)|浏览(233)

在SQL Server中,我有一个现有的Document_Add存储过程,它可以正常工作并返回一个正确的DocID值(在Visual Studio vb代码中),而且不能更改。在SQL中调用它时如下:

EXEC @DocID = PADS2.dbo.Document_Add @SystemCode...

这会执行存储程序,但@DocID永远是0(不论是宣告为INTvarchar)。
@DocID应为2594631或类似值。
有什么想法吗?

fcg9iug3

fcg9iug31#

我总是说RTFM -阅读微软提供的精美手册。
https://learn.microsoft.com/en-us/sql/t-sql/statements/create-procedure-transact-sql?view=sql-server-ver16
请记住,输入和输出参数是标量,而不是表。
如果您确实需要输入一个表,请参阅示例G。

3 - Example G - how to pass a table value parameter
4 - Example B - return multiple result sets.

如果在过程中执行两个SELECT语句,则将具有MARS(多个活动结果集).
默认情况下,过程返回的值为零。它通常用于指示过程是否成功。您可以编写非零值来指示错误。
一定要阅读文档!

sdnqo3pr

sdnqo3pr2#

【如果这里不是跟进的地方,请告知。】
贷记至rjs123431:
SQL SP的结尾如下:

...
    SELECT @Rslt = CONVERT(VARCHAR(2000),@NewId)
    select @Rslt;
END

在vb中返回字符串“2680914”:

sDocid = DA.ExecScalarString(EXEC PADS2.DBO.[Document_Add] 'C', ...)

但从SQL调用时返回0,如下所示:

EXEC @DocID = PADS2.dbo.Document_Add @SystemCode...

在使用如下所示的临时表时,将返回正确的DocID(2680914):

INSERT INTO @TempTable EXEC PADS2.dbo.Document_Add @SystemCode...
set @sDocID = (SELECT DocID FROM @TempTable)

相关问题