2014-01-24 91 views
0
@id NVARCHAR(12), 
@query NVARCHAR(500), 
@paramDef NVARCHAR(100) = N'@id NVARCHAR(12)' 

我有下面这行了语法错误,特别是在@idsp_executesql的带参数的语法错误

set @query = N'select * from OPENQUERY([REMOTESERVER], ''EXEC db.dbo.dwStoredProc_sp ''@id'')''' 

然后我用

exec sp_executesql @query, @paramDef, @id 

我希望我的单引号是不正确的。

+0

为什么在你的报价参数@id? –

+0

当我通过串联字符串来进行查询时,剩下的就是'sp_executesql'好得多。 – Lee

+0

你的字符串看起来像'select * from OPENQUERY([REMOTESERVER],'EXEC db.dbo.dwStoredProc_sp'@id')''。这是对的吗? –

回答

1

您可能不希望将'@id'作为字符串传递给SP。

这可能是你的意思:

set @query = N'select * from OPENQUERY([REMOTESERVER], ''EXEC db.dbo.dwStoredProc_sp ' + @id + ''')'; 
+0

我不认为要传递实际值而不是占位符。谢谢。 – Lee

+0

那么注射呢?正确的答案是@juergen d答案。 –

+0

我试过了,但是如果你可以在字符串中使用参数,就像在juergen的答案中一样,这当然更可取。 – KekuSemau

4

您最近的)错误,您不需要引用@id。尝试

set @query = 
    N'select * from OPENQUERY([REMOTESERVER], ''EXEC db.dbo.dwStoredProc_sp ' + @id + ''')' 
+0

这是正确答案! –

+0

有了这个,我得到了我需要声明'@ id'标量值 – Lee

+0

的错误啊,我明白了。我更新了答案。 –

1

很显然,这是报价问题。

但论坛给你一个答案并不给你的工具在未来找到问题。

这是一个普遍的调试问题。下一次,打印出动态的TSQL。切入并进入另一个窗口。

你会很快发现你的问题。检查一下鲜为人知的处理指令命令。

适用于巨大的多行语句。

-- Old school output to message window 
PRINT @query 

-- Cool instruction ? Code in new xml tab. 
SELECT @query as [processing-instruction(TSQL)] FOR XML PATH 

打印样本的使用。

你应该给Juergen的信贷!

enter image description here

+0

感谢您的建议。 – Lee