从EXEC存储过程中选择特定列

时间:2013-07-25 16:02:11

标签: sql sql-server sql-server-2008 select stored-procedures

我在尝试SELECT存储过程的EXEC语句中的特定列时遇到问题。我试图找到存储过程返回的COUNT(*),我正在成功地使用它:

INSERT INTO #temp
EXEC dbo.my_sp
SET @count = (SELECT COUNT(*) FROM #temp)
DELETE FROM #temp

但是,这仅在返回的列与表列具体匹配时才有效,因为我试图找到许多不同存储过程的计数(每个存储过程都返回不同的列),所以我不能在不创建新的情况下使用此方法每个存储过程的表。

我是否可以SELECT EXEC dbo.my_sp中的特定列?

2 个答案:

答案 0 :(得分:3)

为本地实例创建一个环回链接服务器,确保启用了数据访问。假设您有一个名为YourServer\SQL2008的本地命名实例:

USE [master];
GO
EXEC sp_addlinkedserver 
  @server     = N'LoopbackLocal', 
  @srvproduct = N'',
  @provider   = N'SQLNCLI', 
  @datasrc    = N'.\SQL2008', 
  @catalog    = N'tempdb';
GO

EXEC sp_serveroption 
  @server   = N'LoopbackLocal', 
  @optname  = N'collation compatible', 
  @optvalue = N'true';
GO

EXEC sp_serveroption 
  @server   = N'LoopbackLocal', 
  @optname  = N'data access', 
  @optvalue = N'true';
GO

EXEC sp_addlinkedsrvlogin 
  @rmtsrvname = N'LoopbackLocal', 
  @locallogin = NULL , 
  @useself    = N'True';
GO
-- you may need to configure other security here

然后,您可以使用OPENQUERY来运行存储过程,就像它是一个即席查询一样。

SELECT COUNT(*)
  FROM OPENQUERY
  (
    LoopbackLocal, 
    'EXEC dbo.my_sp'
  ) AS y;

现在,如果dbo.my_sp首先将信息转储到#temp表中,那么您将遇到问题,因为它不再是OPENQUERY可以处理的代码块。例如,如果您尝试以这种方式执行sp_who2,至少在SQL Server 2012中,您将收到来自sp_describe_first_result_set OPENQUERY已被更改使用的错误(因此可能这样做对你来说,我没有2008年进行测试,但有一天它会成为一个问题:

  

Msg 11526,Level 16,State 1,Procedure sp_describe_first_result_set,Line 1   
无法确定元数据,因为...使用临时表。

但是,如果你要做很多事情,为什么不制作专门的存储过程(或者为这些过程添加选项),以便只返回一个计数?

答案 1 :(得分:1)

@@ ROWCOUNT会为你工作吗?

if OBJECT_ID('SomeProc') is null
    exec ('create procedure dbo.SomeProc as select 1 as SomeValue union all select 2 as SomeValue;')

exec dbo.SomeProc

Select @@ROWCOUNT as RowsAffected

http://technet.microsoft.com/en-us/library/ms187316(v=sql.105).aspx