2017-08-01 56 views
2

我试图编写一个存储过程(或函数,如果更容易)查询链接的数据库并返回一个值,但大量挣扎。任何帮助,不胜感激...无法从存储过程中的链接数据库返回值

我曾尝试:

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。

请帮忙!

回答

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存储过程是状态INTVARCHAR(50)

+1

正是我错过了,谢谢。还需要将'SP_EXECUTE'更改为'SP_EXECUTESQL'。 –