2014-01-09 37 views
0

我跑SQL错误使用动态SQL查询的变量声明

declare @h nvarchar(max) 
declare @i int 
set @i =1 
declare @two nvarchar(max) 
select @h = 'set @two = (select word from #LocalTempTable where Idcolumn =' + cast(@i as nvarchar(max)) +')' 
exec(@h) 
print @two 

以下查询我有以下错误

Msg 137, Level 15, State 1, Line 1 
Must declare the scalar variable "@two". 

这究竟是为什么?

+0

它是因为动态sql的范围与声明该变量的批处理或proc不同。改为使用sp_executeSQL,它接受参数。你仍然有一个问题引用#LocalTempTable –

+0

谢谢康拉德。我将exec(@h)更改为exec sp_executeSQL @h。仍然得到完全相同的错误。我做了正确的改变吗? – user3171919

+0

你想写动态SQL吗? – logixologist

回答

2

这里是更正的一个。这里是sqlfiddle

declare @h nvarchar(max) 
declare @i int 
set @i =1 
declare @two nvarchar(max) 
select @h = 'select @to = word from #LocalTempTable where Idcolumn =' + cast(@i as nvarchar(max)) 
exec sp_executesql @h, N'@to nvarchar(max) output', @[email protected] output 
print @two 
+0

这是美丽的谢谢,我可能会有更多的问题向你咨询Yarla。谢谢! – user3171919

+0

当然,拍摄的问题是如此,如果不是我,别人也可以提供答案 - 一切顺利。 –

2

你有一个变量范围的问题,@two你的@h变量没有被声明。

你可以把它声明的变量@h里面:

DECLARE @h nvarchar(max) 
     ,@i INT = 1 
SELECT @h = 'declare @two nvarchar(max) set @two = (select ''dog' + CAST(@i as nvarchar(max)) +''')' 
EXEC(@h) 

你将不得不与#temp表仍然是一个范围的问题,里面宣称这使得它无法使用外,所以没有太多指向它。