如何在不使用temp的情况下从存储过程的结果集中选择一列。表?

时间:2011-01-31 10:32:32

标签: sql-server-2005 stored-procedures subquery resultset

我在SQL Server 2005中有一个存储过程。它在一行中返回三个变量,就像这个(极简化)示例:

CREATE PROCEDURE proc1
AS
   DECLARE @col1 VARCHAR(4)
   DECLARE @col2 VARCHAR(4)
   DECLARE @col3 VARCHAR(4)
   SET @col1 = 'val1'
   SET @col2 = 'val2'
   SET @col3 = 'val3'

   SELECT @col1 col1, @col2 col2, @col3 col3
GO

在外部应用程序中,我需要执行存储过程并处理三个值中的一个。由于此应用程序的限制,它始终只使用第一列。

所以,我正在寻找的方法是将过程的结果集限制为一列或重新排列列的顺序。

IIRC MySQL支持如下的子查询,但SQL Server不支持:

SELECT col1 FROM (EXEC proc1)

我知道我可以使用临时表(或表变量)来缓冲结果,然后选择一列,但我希望有一种比这更“浓缩”的方式:

CREATE TABLE #tmp (col1 VARCHAR(4) NOT NULL, col2 VARCHAR(4) NOT NULL, col3 VARCHAR(4) NOT NULL)
INSERT INTO #tmp EXEC proc1
SELECT col2 FROM #tmp
DROP TABLE #tmp

提前感谢您提供的任何提示,

帕特里克

1 个答案:

答案 0 :(得分:2)

如果您可以将存储过程转换为table valued function,则可以从中选择任意列。如果您仍然需要存储过程(对于其他一些无法更改的系统),您可以将所有逻辑放入函数中,并获取存储过程来调用它。

否则,如果你不能从存储过程中重新定位代码,那么通过临时表可以做到最好,我担心。