J'ai une procédure stockée (SP) dans laquelle je passe une valeur. Dans ce SP, j'essaie de créer / peupler une table TEMP à partir du résultat d'un autre SP qui se trouve sur un serveur lié / distant. C'est-à-dire que j'essaie d'exécuter un SP dans mon SP et de peupler une table temporeuse que ma requête utilisera.
J'ai essayé d'utiliser la syntaxe suivante, mais cela ne fonctionne pas car il semble que l'openquery n'aime pas le "+" ou le paramètre @ param1. p> si j'ai la valeur du paramètre codé dur dans ceci fonctionne bien. P> create table #tempTable(
.
.
.
)
insert into #tempTable
(
.
.
.
)
Exec [the Linked server],'exec thelinkedSPname ' + @param1
5 Réponses :
Deux mots: requête dynamique. Essayez ceci:
DECLARE @TSQL varchar(8000) SELECT @TSQL = 'SELECT * INTO #tempTable FROM OPENQUERY([the Linked server],''exec [the Linked server].DBName.dbo.thelinkedSPname ' + @param1 + ''')' EXEC (@TSQL)
De cette façon, l'OP ne sera pas en mesure d'utiliser #TeCide, car ces résultats ne seront pas disponibles pour lui
Je pense que vous allez avoir besoin dynamique SQL, car vous ne pouvez pas transmettre le paramètre à un OpenQuery code> comme celui-ci (mais visitez la première visite de ce lien ) Vous auriez donc quelque chose comme ceci:
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)
Cette réponse a une citation / apostrophe supplémentaire après le nom de SP qui m'a conduit noix avant de le comprendre. Il devrait lire "EXEC THELINKEDSPNAME" + @ param1 + '' ')'. Notez l'apostrophe singulière après ThelinkedSpname.
Avec les avertissements habituels à propos de Garding Dynamic SQL, vous pouvez le faire sans openquery, etc. Il suffit d'appeler sp_executesql à distance:
Avec certains soins, vous pouvez utiliser une table TEMP partagée:
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
J'utilise cette méthode assez fréquemment:
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)
Remarque J'avais une faute de frappe dans l'exécutif de la dernière requête aurait dû être exécutée [le serveur lié] .dbname.dbo.thelinkedspName 2011