0

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

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

但是,这仅在返回的列与表列特别匹配时才有效,并且由于我试图找到许多不同存储过程的计数(每个存储过程返回不同的列),如果不为每个存储过程创建一个新表,我就无法使用此方法存储过程。

有没有办法我可以SELECT从特定列EXEC dbo.my_sp

4

2 回答 2

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_setOPENQUERY所以也许现在这对您有用,我没有 2008 来测试,但它总有一天会成为一个问题):

消息 11526,级别 16,状态 1,过程 sp_describe_first_result_set,第 1 行
无法确定元数据,因为 ... 使用临时表。

但是,如果您要经常这样做,为什么不制作专门的存储过程(或向这些存储过程添加选项)以便只返回一个计数?

于 2013-07-25T16:05:44.803 回答
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

于 2013-07-25T16:38:53.620 回答