执行openrowset存储过程,参数使用

时间:2017-10-27 07:43:04

标签: sql sql-server stored-procedures openrowset

一点背景资料:

我有一个存储过程,我们称之为SP1。 SP1调用另一个存储过程:SP2。 SP2调用另一个存储过程:SP3。

现在,第一个存储过程(SP1)返回结果集。结果集是SP2的参数,这是通过游标完成的。

由于这些嵌套的插入和执行,我必须使用openrowset动态SQL字符串来执行我的存储过程。

这是我的疑问:

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命令和相应的过程参数?

2 个答案:

答案 0 :(得分:0)

所有这些引用都令人困惑。通过在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 - 这将消除一些引号,让您担心。一旦你有了工作,你可以继续添加字符串参数,直到你得到你想要的。

答案 1 :(得分:0)

对于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)