【问题标题】:Execute openrowset stored procedure, parameter use执行openrowset存储过程,参数使用
【发布时间】:2017-10-27 07:43:03
【问题描述】:

一点背景资料:

我有一个存储过程,我们称之为 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 命令?

【问题讨论】:

  • 为什么不使用 OUTPUT 参数呢?

标签: sql sql-server stored-procedures openrowset


【解决方案1】:

所有这些引用都会让人感到困惑。通过在exec 之前执行select @sql,您可以看到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'''
             )

为了帮助您构建最终解决方案,您可以尝试使用带有两个 numeric 参数的虚拟 SP1 - 这将消除一些让您担心的引号。一旦你有了这个工作,你可以继续添加字符串参数,直到你得到你想要的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 在他的情况下 [local] 不是链接服务器,所以至少他应该先创建它
    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 2012-01-31
    • 2010-12-08
    相关资源
    最近更新 更多