2009-02-11 124 views
3

我的sql語句是這樣的下面動態SQL語句來更新變量

DECLARE @OLD_NAV_VALUE AS INT 
DECLARE @FINAL AS INT 

SELECT @OLD_NAV_VALUE = [col1] from TBL_BA where DATE = @id_Date 

SET @FINAL = @OLD_NAV_VALUE * 50 

但我在這裏巡航能力的問題是,它是作爲[COL1]在select語句中的列名是動態值。所以我正在嘗試如下所示。

DECLARE @OLD_NAV_VALUE AS INT 
DECLARE @FINAL AS INT 

EXEC('SELECT @OLD_NAV_VALUE = [' + @DYNAMIC_COL_NAME + '] from TBL_BA where DATE = ' + @id_Date) 

SET @FINAL = @OLD_NAV_VALUE * 50 

這給出了一個錯誤,即必須聲明@OLD_NAV_VALUE。所以我試圖在EXEC語句中聲明@OLD_NAV_VALUE。但是,如果我這樣做,我不能在EXEC聲明外使用相同的內容。

請讓我知道如何做到這一點。

+0

以下是Tom H.希望您閱讀的文章的鏈接。 http://www.sommarskog.se/dynamic_sql.html如果你使用動態sql,這是一篇必讀文章。 – HLGEM 2009-02-11 14:54:42

回答

1

這對我有效。

我聲明瞭一個臨時表並使用它來接收select語句中的值。

像下面這樣的東西。

declare @i int 
declare @v int 
create table #t (val int) 
insert into #t 
exec ('declare @i int set @i = 0 select @i+1') 
select * from #t 
1

首先,我建議您在「厄蘭動態SQL」做一個谷歌,看他的白皮書的主題。

您的設計可能不是最好的,如果它需要你使用動態列名這樣的。

,你不能做你想要做的原因是,一切都在EXEC完全是在自己的範圍內。如果你絕對必須這樣做,那麼你可以使用一個表(普通表或全局臨時表)來存儲在EXEC外部使用的值。

4

您還可以使用sp_executesql的語句的輸出參數:

declare @field nvarchar(50); 
set @field = N'FieldToSelect'; 

declare @sql nvarchar(3000); 
declare @parmDefinition nvarchar(500); 

SET @parmDefinition = N'@returnValueOUT nvarchar(50) OUTPUT'; 

set @sql = N'SELECT @ReturnValueOUT = ' + @Field + ' FROM [TableName] WHERE [SomeCondition]' 

declare @returnValue nvarchar(50); 
EXECUTE sp_executesql @sql, @parmDefinition, @returnValueOut = @returnValue OUTPUT; 

SELECT @returnValue 
1

我們使用sp_executesql。以下是參數化記錄計數的另一個示例:

DECLARE @sql AS nvarchar(MAX) 
SET @sql = N'SELECT @RecordCount = COUNT(*) FROM [{@SchemaName}].[{@TableName}]' 
SET @sql = REPLACE(@sql, '{@SchemaName}', @SchemaName) 
SET @sql = REPLACE(@sql, '{@TableName}', @TableName) 

DECLARE @RecordCount AS int 
EXEC sp_executesql 
    @query = @sql, 
    @params = N'@RecordCount INT OUTPUT', 
    @RecordCount = @RecordCount OUTPUT