web-dev-qa-db-fra.com

Utilisation d'une variable dans la requête OPENROWSET

J'ai des problèmes avec cette requête:

SELECT * 
FROM OPENROWSET(
    'SQLNCLI',
    'DRIVER={SQL Server};',
    'EXEC dbo.sProc1 @ID = ' + @id 
 )

Donne une erreur:

Syntaxe incorrecte près de '+'.

Quelqu'un sait pourquoi je reçois cette erreur?

28
Control Freak

Comme suggéré par Scott, vous ne pouvez pas utiliser d'expressions dans OPENROWSET. Essayez de créer un SQL dynamique pour transmettre les paramètres.

Declare @ID int
Declare @sql nvarchar(max)
Set @ID=1
Set @sql='SELECT * 
FROM OPENROWSET(
               ''SQLNCLI'',
               ''DRIVER={SQL Server};'',
               ''EXEC dbo.usp_SO @ID =' + convert(varchar(10),@ID) + ''')'

-- Print @sql
 Exec(@sql)
43
praveen

OPENROWSET nécessite des littéraux de chaîne, pas des expressions. C'est se plaindre du signe plus, car il n'attend rien de plus qu'un littéral de chaîne et vous l'avez suivi avec un opérateur.

Voir http://msdn.Microsoft.com/en-us/library/ms190312.aspx qui indique:

'question'

Une constante de chaîne est-elle envoyée et exécutée par le fournisseur ...

11
Scott
Declare @Route VARCHAR(200)
Declare @sql nvarchar(max)
Set @Route='C:\OCRevisiones.xlsx;'
Set @sql='SELECT * INTO FFFF
FROM OPENROWSET(
               ''Microsoft.ACE.OLEDB.12.0'',
               ''Excel 12.0;HDR=YES;Database=' + @Route + ''',
               ''SELECT * FROM [Sheet1$]'')'

 Print @sql
 --Exec(@sql)
2
yordinet

Si vous avez besoin de paramètres, vous pouvez également utiliser sp_executesql:

BEGIN

DECLARE
@p_path varchar(200)='D:\Sample\test.xml',  
@v_xmlfile xml,
@v_sql nvarchar(1000)

SET @v_sql=N'select @v_xmlfile= CONVERT(XML, BulkColumn) FROM 
OPENROWSET(BULK '''+@p_path+''', SINGLE_BLOB) AS x;'

EXEC sp_executesql @v_sql,N'@v_xmlfile xml output',@v_xmlfile output;

SELECT @v_xmlfile

END
0
harmath

Pour ce qui en vaut la peine ... La raison pour laquelle nous utilisons openrowset plutôt qu'une requête directe de serveur lié est que le traitement d'une requête de serveur lié a lieu sur le serveur local. (Lent et ramène souvent la plupart de la table en arrière)

Oui, nous pouvons faire la concaturation de chaînes comme ci-dessus.

Une option différente où vous avez la facilité de syntaxe et la puissance des paramètres.

Créez un proc stocké sur la boîte distante, qui contienne tous les paramètres dont vous avez besoin ..__ Appelez le proc stocké avec une requête de serveur lié standard (même performance ou meilleure que l’âme ci-dessus et beaucoup plus facile à coder.

par exemple. linkedservername.database.dbo.myproc 123, 'abc', 'someparam', getdate ()

Juste une option ....

0
roblem