存储过程并使用参数从链接的存储过程填充Temp表

时间:2011-08-19 19:22:14

标签: sql-server stored-procedures linked-server

我有一个存储过程(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只是伪代码

5 个答案:

答案 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)

答案 1 :(得分:3)

使用关于保护动态SQL的通常免责声明,您可以在没有OPENQUERY等的情况下执行此操作。只需远程调用sp_executesql:

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

答案 2 :(得分: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

答案 3 :(得分: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)

答案 4 :(得分: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