2011-08-19 98 views
4

我有一个存储过程(SP),其中传递了一个值。在此SP中,我试图根据链接/远程服务器上另一个SP的结果创建/填充临时表。那就是我试图执行SP中的SP并填充我的查询将使用的临时表。存储过程并使用参数填充链接的存储过程的临时表

我试过使用下面的语法,但它不工作,因为它似乎openquery不喜欢“+”或@ param1参数。

select * into #tempTable 
from openquery([the Linked server],'exec thelinkedSPname ' + @param1) 

如果我有参数值硬编码在这工作正常。

select * into #tempTable 
from openquery([the Linked server],'exec thelinkedSPname 2011') 

我也一直手动建立临时表,并试图执行链接的SP,但那不起作用。

create table #tempTable(
. 
. 
. 
) 

insert into #tempTable 
(
. 
. 
. 
) 
Exec [the Linked server],'exec thelinkedSPname ' + @param1 

任何建议,如何从执行通过链接服务器SP一个SP内填充临时表。注意上面的SQL只是伪代码

+0

注意,我在的EXEC一个错字最后的查询应该是 exec [链接的服务器] .DBName.dbo.thelinkedSPname 2011 –

回答

1

两个字:动态查询。 试试这个:

DECLARE @TSQL varchar(8000) 
SELECT @TSQL = 'SELECT * INTO #tempTable FROM OPENQUERY([the Linked server],''exec [the Linked server].DBName.dbo.thelinkedSPname ' + @param1 + ''')' 
EXEC (@TSQL) 

这很好这里记载: How to pass a variable to a linked server query

+2

这样,操作将无法使用#tempTable,因为这些结果将不可用于他 – Lamak

+0

感谢这工作。 –

6

我想你会需要动态SQL,因为你不能将参数传递给一个OPENQUERY这样的(但第一次访问这个link),所以,你会是这样的:

create table #tempTable(
. 
) 

DECLARE @param1 VARCHAR(10), @Query VARCHAR(8000) 
SET @param1 = '2011' 
SET @Query = ' 
SELECT * 
FROM OPENQUERY([Linked Server],''exec thelinkedSPname '' + @param1+''')' 

INSERT INTO #tempTable 
EXEC(@Query) 
3

拥有约守着动态SQL常用的免责声明,你可以做到这一点没有OPENQUERY等只需调用远程对sp_executesql:

DECLARE @sql NVARCHAR(MAX); 
SET @sql = N'EXEC thelinkedSPname ' + @param1 + ';'; 
INSERT #temptable EXEC [LinkedServerName].database.dbo.sp_executesql @sql; 
0

有了一定的照顾,你可以使用一个共享的临时表:

DECLARE @Qry AS VARCHAR(MAX) 
SET @Qry = 'select * into ##tempTable from openquery([the Linked server],''exec thelinkedSPname ' + @param1 + ''')' 
EXEC (@Qry) 

-- Now just use the shared Temp table, or I suppose you could copy it to a temp table just as you wanted it: 

SELECT * INTO #tempTable FROM(SELECT * FROM ##tempTable)tbl 
DROP TABLE ##tempTable 
1

我用这个方法相当频繁:

DECLARE @YEAR AS VARCHAR(4) SET @YEAR = 2015 
DECLARE @SQL AS VARCHAR(MAX) 
DECLARE @OPENQUERY AS VARCHAR(MAX) 
DECLARE @LINKEDSERVER AS VARCHAR(MAX) SET @LINKEDSERVER = 'Name of Linked Server here with out brackets' 

SET @SQL=' 
Select 
tbl1.* 
FROM 
dbo.Table_ON_LINKED_SERVER AS tbl1 
WHERE 
tbl1.number_id = ''''1'''' 
AND YEAR(tbl1.DATETIME) = ' + @YEAR + ' 
AND tbl1.NAME <> ''''%JONES%'''' 
''' 

SET @OPENQUERY = 'SELECT * INTO ##GLOBAL_TEMP_NAME FROM OPENQUERY(['+ @LINKEDSERVER +'],''' + @SQL + ')' 
--SELECT @OPENQUERY 
EXEC(@OPENQUERY)