Выполнение хранимой процедуры openrowset, использование параметров

Немного справочной информации:

У меня есть хранимая процедура, назовем ее SP1. SP1 вызывает другую хранимую процедуру: SP2. SP2 вызывает другую хранимую процедуру: SP3.

Теперь первая хранимая процедура (SP1) возвращает набор результатов. Набор результатов - это параметры для SP2, это делается с помощью курсора.

Из-за этих вложенных операций вставки и выполнения мне приходится использовать динамическую строку SQL openrowset для выполнения хранимых процедур.

Это мой запрос:

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 =    '''''+@P_Source+'''''''
                ,@P_Location =  '''''+@P_Location+'''''''
                 )'

exec(@sql)

(Я, конечно, создал таблицу #tmp). У меня есть больше параметров, если быть точным (12), все varchar, но я оставил их, чтобы не запутать.

Я получаю следующую ошибку

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

правильно ли я использую команду openrowset с соответствующими параметрами процедуры?


person ImperialBert    schedule 27.10.2017    source источник
comment
почему бы вам не использовать вместо этого параметры ВЫХОДА?   -  person sepupic    schedule 27.10.2017


Ответы (2)


Все эти цитаты сбивают с толку. Выполнив select @sql до exec, вы можете увидеть, что SQL Server собирается попробовать и что он сделает. На основании предоставленного вами запроса @sql в настоящее время содержит:

INSERT INTO #tmp 

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

Чтобы помочь вам создать окончательное решение, вы можете попробовать создать фиктивный пакет SP1, который принимает два числовых параметра - это избавит вас от некоторых кавычек, о которых вам нужно беспокоиться. После того, как у вас все получится, вы можете приступить к добавлению строковых параметров, пока не получите то, что хотите.

person Wayne Ivory    schedule 27.10.2017

Для связанного сервера sql используйте OPENQUERY
https://docs.microsoft.com/en-us/sql/t-sql/functions/openquery-transact-sql и 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 = '''''+@P_Source+''''', @P_Location = '''''+@P_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)
person Stanislav Kundii    schedule 27.10.2017
comment
В его случае [local] не является связанным сервером, поэтому, по крайней мере, он должен сначала его создать. - person sepupic; 27.10.2017