一点背景资料:
我有一个存储过程,我们称之为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命令和相应的过程参数?
答案 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)