Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 执行openrowset存储过程,参数使用_Sql_Sql Server_Stored Procedures_Openrowset - Fatal编程技术网

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

Sql 执行openrowset存储过程,参数使用,sql,sql-server,stored-procedures,openrowset,Sql,Sql Server,Stored Procedures,Openrowset,一点背景信息: 我有一个存储过程,我们称之为SP1。SP1调用另一个存储过程:SP2。SP2调用另一个存储过程:SP3 现在,第一个存储过程(SP1)返回一个结果集。结果集是SP2的参数,这是用光标完成的 由于这些嵌套的插入和执行,我必须使用openrowset动态SQL字符串来执行存储过程 这是我的疑问: DECLARE @P_Source varchar(255) = 'test' DECLARE @P_Location varcha

一点背景信息:

我有一个存储过程,我们称之为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命令和相应的过程参数

所有这些引语都令人困惑。通过在执行之前执行
选择@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'''
             )

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

所有这些引号都会让人困惑。通过在执行之前执行
选择@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'''
             )

为了帮助您构建最终的解决方案,您可以尝试使用一个包含两个数字参数的虚拟SP1,这将消除您需要担心的一些引号。完成该工作后,您可以继续添加字符串参数,直到获得所需的参数。

对于sql链接服务器,请使用OPENQUERY
和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)

对于sql链接服务器,请使用OPENQUERY
和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]不是链接服务器,所以至少他应该先创建它在他的情况下[local]不是链接服务器,所以至少他应该先创建它