2009-02-11 2 views
3

моего 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] является динамическое значение. Поэтому я пытаюсь сделать что-то вроде этого ниже.

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. Поэтому я попытался объявить @OLD_NAV_VALUE внутри инструкции EXEC. Но если я это сделаю, я не смогу использовать его за пределами инструкции EXEC.

Пожалуйста, дайте мне знать, как это сделать.

+0

Вот ссылка на статью Тома Х. хочет, чтобы вы прочитали. http://www.sommarskog.se/dynamic_sql.html Если вы используете динамический sql вообще, это обязательная статья. – HLGEM

ответ

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

Во-первых, я предлагаю вам сделать Google на «Erland dynamic 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