Хранимая процедура и заполнение таблицы Temp из связанной хранимой процедуры с параметрами - PullRequest
6 голосов
/ 19 августа 2011

У меня есть хранимая процедура (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 ]

6 голосов
/ 19 августа 2011

Я думаю, что вам понадобится динамический SQL, так как вы не можете передать параметр в OPENQUERY как этот (но сначала посетите эту ссылку ), так что у вас будет что-то вроде этого:

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 голосов
/ 19 августа 2011

С обычными заявлениями об отказе от защиты динамического SQL вы можете сделать это без OPENQUERY и т.д. Просто вызовите sp_executesql удаленно:

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'EXEC thelinkedSPname ' + @param1 + ';';
INSERT #temptable EXEC [LinkedServerName].database.dbo.sp_executesql @sql;
2 голосов
/ 19 августа 2011

Два слова: динамический запрос. Попробуйте это:

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

Это хорошо задокументировано здесь: Как передать переменную в запрос связанного сервера

1 голос
/ 07 ноября 2015

Я использую этот метод довольно часто:

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)
0 голосов
/ 13 августа 2015

С некоторой осторожностью вы можете использовать общую временную таблицу:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...