我在尝试SELECT
存储过程的EXEC
语句中的特定列时遇到问题。我试图找到存储过程返回的COUNT(*)
,我正在成功地使用它:
INSERT INTO #temp
EXEC dbo.my_sp
SET @count = (SELECT COUNT(*) FROM #temp)
DELETE FROM #temp
但是,这仅在返回的列与表列具体匹配时才有效,因为我试图找到许多不同存储过程的计数(每个存储过程都返回不同的列),所以我不能在不创建新的情况下使用此方法每个存储过程的表。
我是否可以SELECT
EXEC dbo.my_sp
中的特定列?
答案 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