2014-01-09 47 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表仍然是一個範圍的問題,裏面宣稱這使得它無法使用外,所以沒有太多指向它。