2010-05-17 89 views
3

我有一个存储过程,它返回了大约50列。我想写一个查询,在那里我可以从SP返回的列列表中选择一个特定的列。选择一个存储过程返回的列

我试过写select RSA_ID from exec(uspRisksEditSelect '1')但它给我一个错误。 我认为我们需要为它编写一些动态sql。但我对它很陌生。

+1

这是抛出一个错误 - 照顾分享这个错误? – Oded 2010-05-17 07:41:53

+0

exec(uspRisksEditSelect,'1')是否返回单个值或表? – 2010-05-17 07:48:01

回答

6

不能直接使用存储过程的结果 - 你需要存储到内存或临时表,并从那里:

DECLARE @tableVar TABLE (ID INT, Name VARCHAR(50)) -- whatever your sp returns 

INSERT INTO @tableVar 
    EXEC uspRisksEditSelect '1' 

SELECT RSA_ID FROM @tableVar 

但绝对没有必要使用动态SQL。 ....

+1

这是否适用于嵌套EXEC调用的存储过程?例如:msdb.dbo.sp_help_job – MarmiK 2014-01-24 12:27:15

3

你应该写一个表值用户函数。

+0

这应该是OP的评论,因为它没有回答这个问题。有可能您的建议不是一种选择。如果他/不能/创建TVF会怎么样? – 2014-04-04 00:15:46

0

如果你可以修改你的存储过程,你可以很容易地把需要的列数为参数:

CREATE PROCEDURE sp_GetDiffDataExample 
     @columnsStatement NVARCHAR(MAX) -- Needed columns 
AS 
BEGIN 
    DECLARE @query NVARCHAR(MAX) 
    SET @query = N'SELECT ' + @columnsStatement + N' INTO ##TempTable FROM dbo.TestTable' 
    EXEC sp_executeSql @query 
    SELECT * FROM ##TempTable 
    DROP TABLE ##TempTable 
END 

在这种情况下,你并不需要创建ŧ emp表手动 - 它会自动创建。希望这可以帮助。