2009-02-11 137 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