web-dev-qa-db-de.com

Verwenden einer Variablen in der OPENROWSET-Abfrage

Ich habe Probleme mit dieser Abfrage:

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

Gibt einen Fehler aus:

Falsche Syntax in der Nähe von '+'.

Weiß jemand, warum ich diesen Fehler bekomme?

28
Control Freak

Wie von Scott vorgeschlagen, können Sie in OPENROWSET keine Ausdrücke verwenden

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 erfordert String-Literale, keine Ausdrücke. Es beschwert sich über das Pluszeichen, denn es erwartet nichts weiter als ein String-Literal, und Sie haben das String-Literal mit einem Operator gefüllt.

Siehe http://msdn.Microsoft.com/de-de/library/ms190312.aspx die besagt:

'Abfrage'

Wird eine Stringkonstante an den Provider gesendet und von diesem ausgeführt ...

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

Wenn Sie Parameter benötigen, können Sie auch sp_executesql verwenden:

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 '''[email protected]_path+''', SINGLE_BLOB) AS x;'

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

SELECT @v_xmlfile

END
0
harmath

Für was es wert ist .. Der Grund, warum wir openrowset anstelle einer direkten Abfrage eines Verbindungsservers verwenden, ist, dass die Verarbeitung einer Abfrage eines Verbindungsservers auf dem lokalen Server erfolgt. (Langsam und bringt oft den größten Teil des Tisches zurück)

Ja, wir können die String-Concatination wie oben beschrieben durchführen.

Eine andere Option, bei der Sie die Syntax und die Leistungsfähigkeit von Parametern einfach beherrschen.

Erstellen Sie eine gespeicherte Prozedur in der Remote-Box, die alle erforderlichen Parameter enthält. Rufen Sie die gespeicherte Prozedur mit einer Standard-Abfrage eines verknüpften Servers auf (gleiches oder besseres Ergebnis als die obige Lösung und wesentlich einfacher zu codieren.

z.B. linkedservername.database.dbo.myproc 123, 'abc', 'someparam', getdate ()

Nur eine Option ....

0
roblem