Quassnoi让我大部分时间都在那里,但有一点缺失:
****我需要在存储过程中使用参数****
OPENQUERY不允许这种情况发生:
因此,我找到了一种工作系统的方法,而且不必使表定义如此严格,并在另一个存储过程中重新定义它(当然,也要抓住它可能中断的机会)!
是的,您可以通过以下方式动态创建从存储过程返回的表定义使用带有伪变量的OPENQUERY语句(只要NO RESULT SET返回与具有良好数据的数据集相同数量的字段和相同位置)。
一旦创建了表,就可以整天在临时表中使用exec存储过程。
注意(如上所述),您必须启用数据访问,
EXEC sp_serveroption 'MYSERVERNAME', 'DATA ACCESS', TRUE
代码:
declare @locCompanyId varchar(8)
declare @locDateOne datetime
declare @locDateTwo datetime
set @locDateOne = '2/11/2010'
set @locDateTwo = getdate()
--Build temporary table (based on bogus variable values)
--because we just want the table definition and
--since openquery does not allow variable definitions...
--I am going to use bogus variables to get the table defintion.
select * into #tempCoAttendanceRpt20100211
FROM OPENQUERY(DBASESERVER,
'EXEC DATABASE.dbo.Proc_MyStoredProc 1,"2/1/2010","2/15/2010 3:00 pm"')
set @locCompanyId = '7753231'
insert into #tempCoAttendanceRpt20100211
EXEC DATABASE.dbo.Proc_MyStoredProc @locCompanyId,@locDateOne,@locDateTwo
set @locCompanyId = '9872231'
insert into #tempCoAttendanceRpt20100211
EXEC DATABASE.dbo.Proc_MyStoredProc @locCompanyId,@locDateOne,@locDateTwo
select * from #tempCoAttendanceRpt20100211
drop table #tempCoAttendanceRpt20100211
感谢最初提供的信息。。。是的,最后,当使用来自另一个存储过程或数据库,是的,您也可以使用参数。
搜索参考标记:
SQL 2005存储过程到临时表带有存储过程和变量的openquery 2005带变量的openquery将存储过程执行到临时表中
更新:这将不适用于临时表,因此我不得不求助于手动创建临时表。
Bummer注意:这将不适用于临时表,http://www.sommarskog.se/share_data.html#OPENQUERY
参考:下一步是定义LOCALSERVER。在示例中,它可能看起来像一个关键字,但实际上它只是一个名称。这是您的做法:
sp_addlinkedserver @server = 'LOCALSERVER', @srvproduct = '',
@provider = 'SQLOLEDB', @datasrc = @@servername
要创建链接服务器,您必须具有ALTER ANY server权限,或者是任何固定服务器角色sysadmin或setupadmin的成员。
OPENQUERY打开与SQL Server的新连接。这有一些含义:
使用OPENQUERY调用的过程不能引用在当前连接中创建的临时表。
新连接有自己的默认数据库(使用sp_addlinkedserver定义,默认为master),因此所有对象规范都必须包含数据库名称。
如果您有一个打开的事务,并且在调用OPENQUERY时持有锁,则被调用的过程无法访问您锁定的内容。也就是说,如果你不小心,你会挡住自己。
连接不是免费的,因此会造成性能损失。