Динамическая инструкция SQL для обновления переменной - PullRequest
3 голосов
/ 11 февраля 2009

мое 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.

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

Ответы [ 4 ]

4 голосов
/ 11 февраля 2009

Вы также можете использовать оператор 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 голос
/ 11 февраля 2009

Мы использовали 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 
1 голос
/ 11 февраля 2009

Это сработало для меня.

Я объявил временную таблицу и использовал ее для получения значений из оператора 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 голос
/ 11 февраля 2009

Во-первых, я бы посоветовал вам сделать гугл по «Erland dynamic SQL» и прочитать его технический документ по этому вопросу.

Ваш дизайн, вероятно, не самый лучший, если он требует использования динамического имени столбца, подобного этому.

Причина, по которой вы не можете сделать то, что вы пытаетесь сделать, заключается в том, что все в EXEC полностью находится в своей области видимости. Однако если вам абсолютно необходимо сделать это таким образом, вы можете использовать таблицу (обычную или глобальную временную таблицу) для хранения значения для использования вне EXEC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...