【问题标题】:Unable to return a value from a linked database within stored procedure无法从存储过程中的链接数据库返回值
【发布时间】:2017-08-01 08:48:18
【问题描述】:

我正在尝试编写一个存储过程(或函数,如果更简单的话)来查询链接数据库并返回一个值,但非常困难。非常感谢任何帮助...

我尝试过的:

CREATE Proc dbo.Sample (@FolderID as VARCHAR(50),
@FolderName varchar(50) OUTPUT)
AS
BEGIN

DECLARE @ParamaterDefinition NVARCHAR(500)
DECLARE @FolderNameRet VARCHAR(50)
DECLARE @TSQL NVARCHAR(4000)

SET @TSQL = N'SELECT folder_name FROM OPENQUERY(LINKDB, ''SELECT 
        folder_name 
    FROM FolderTable
    where folder_id = '+ @FolderID +' and folder_status != 0'')'
SET @ParamaterDefinition = N'@FolderID as VARCHAR(50),
                    @FolderName VARCHAR(50) OUTPUT'
EXEC SP_EXECUTE @TSQL,
@ParamaterDefinition,
@FolderID,
@FolderName = @FolderNameRet output

SELECT @FolderNameRet AS "Output"
SELECT @FolderID AS "FolderID1"
SELECT @TSQL AS "Script"
SELECT @FolderName AS "FolderName1"
SELECT @ParamaterDefinition AS "Parameters"

RETURN @FolderNameRet 
END

使用末尾的 SELECT 语句查看每个变量,生成的脚本很好,可以单独运行以获得我想要的值。但是 @FolderNameRet 仍然是 NULL。

我觉得问题在于我试图错误地返回一个值,但我尝试过的每种方法都失败了。

即不要认为我可以在动态脚本中设置返回值,因为这需要以字符串格式作为 OPENQUERY 语句的一部分运行。也尝试使用EXEC @FolderNameRet = SP_EXECUTE @TSQL,但这也返回NULL。

请帮忙!

【问题讨论】:

    标签: sql-server tsql openquery


    【解决方案1】:

    您可以尝试为 @FolderName 变量赋值:

    SET @TSQL = N'SELECT @FolderName = folder_name FROM OPENQUERY(LINKDB, ''SELECT 
            folder_name 
        FROM FolderTable
        where folder_id = '+ @FolderID +' and folder_status != 0'')'
    SET @ParamaterDefinition = N'@FolderID as VARCHAR(50),
                        @FolderName VARCHAR(50) OUTPUT';
    

    对于存储过程,RETURN 也是状态INT 而不是VARCHAR(50)

    【讨论】:

    • 正是我所缺少的,谢谢。还需要将SP_EXECUTE 更改为SP_EXECUTESQL
    猜你喜欢
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    相关资源
    最近更新 更多