Sql 执行openrowset存储过程,参数使用
一点背景信息: 我有一个存储过程,我们称之为SP1。SP1调用另一个存储过程:SP2。SP2调用另一个存储过程:SP3 现在,第一个存储过程(SP1)返回一个结果集。结果集是SP2的参数,这是用光标完成的 由于这些嵌套的插入和执行,我必须使用openrowset动态SQL字符串来执行存储过程 这是我的疑问: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
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]不是链接服务器,所以至少他应该先创建它