2017-10-27 19 views
0

Wenig Hintergrundinformationen:Führen Sie openrowset gespeicherte Prozedur, Parameter verwenden

Ich habe eine gespeicherte Prozedur, nennen wir es SP1. SP1 ruft eine andere gespeicherte Prozedur auf: SP2. SP2 ruft eine andere gespeicherte Prozedur auf: SP3.

Jetzt gibt die erste gespeicherte Prozedur (SP1) eine Ergebnismenge zurück. Die Ergebnismenge sind Parameter für SP2, dies geschieht mit einem Cursor.

Aufgrund dieser verschachtelten Einfügungen und ausgeführt, muss ich eine Openrowset dynamische SQL-Zeichenfolge verwenden, um meine gespeicherten Prozeduren auszuführen.

Dies ist meine Frage:

DECLARE @P_Source    varchar(255) = 'test' 
DECLARE @P_Location    varchar(255) = 'test' 

DECLARE @sql varchar(max) 
     SET @sql = 'INSERT INTO #tmp 

      SELECT * 
      FROM OPENROWSET (
      ''SQLOLEDB'', 
      ''Server=(local);TRUSTED_CONNECTION=YES;'', 
      ''set fmtonly off 
      EXECUTE dbo.SP1  
       @P_Source = '''''[email protected]_Source+''''''' 
       ,@P_Location = '''''[email protected]_Location+''''''' 
       )' 

exec(@sql) 

(Ich habe natürlich die Tabelle #tmp erstellt). Ich habe mehr Parameter um genau zu sein (12), alles Varchar, aber ich habe sie weggelassen, um es nicht unordentlich zu machen.

Ich erhalte die folgenden Fehler

Msg 102, Level 15, State 1, Line 12 
Incorrect syntax near ','. 

bin ich mit dem entsprechenden Prozedurparameter des OPENROWSET Befehl in die richtigen Art und Weise verwenden?

+0

warum Sie OUTPUT-Parameter nicht verwenden Sie stattdessen? – sepupic

Antwort

0

All diese Zitate werden verwirrend. Indem Sie select @sql vor der exec tun, können Sie sehen, was SQL Server versucht geht und tun. Auf der Grundlage der Abfrage, die Sie @sql zur Zeit zur Verfügung gestellt haben enthält:

INSERT INTO #tmp 

     SELECT * 
     FROM OPENROWSET (
     'SQLOLEDB', 
     'Server=(local);TRUSTED_CONNECTION=YES;', 
     'set fmtonly off 
     EXECUTE dbo.SP1  
      @P_Source = ''test''' 
      ,@P_Location = ''test''' 
      ) 

Damit Sie auf die endgültige Lösung aufbauen Sie könnten versuchen, einen Dummy-SP1 haben, das zwei numerische Parameter nimmt - das wird einige Zitate beseitigt für worüber du dir Sorgen machen musst. Sobald Sie damit arbeiten, können Sie fortfahren, String-Parameter hinzuzufügen, bis Sie bekommen, was Sie wollen.

0

für SQL Server verknüpft Verwendung OPENQUERY
https://docs.microsoft.com/en-us/sql/t-sql/functions/openquery-transact-sql und Sp_executesql

DECLARE @P_Source    varchar(255) = 'test' 
DECLARE @P_Location    varchar(255) = 'test' 

DECLARE @SQL NVARCHAR(MAX) = '', 
    @QUERY NVARCHAR(MAX) = '', 
    @Params NVARCHAR(500) = N'DECLARE @P_Source VARCHAR(255),@P_Location VARCHAR(255); ', 
    @ParamsValue NVARCHAR(500) = N'SELECT @P_Source = '''''[email protected]_Source+''''', @P_Location = '''''[email protected]_Location+''''';' 

SET @Query = N'set fmtonly off; EXECUTE dbo.SP1 @P_Source, @P_Location' 
SET @SQL = 'SELECT * FROM OPENQUERY([Local],'' sys.sp_executesql ' + @Params + @ParamsValue + @Query +''' )' 

INSERT INTO #Tmp 
EXEC (@SQL) 
+0

In seinem Fall ist [local] nicht verbundener Server, also sollte er es zumindest zuerst erstellen – sepupic

Verwandte Themen