Столбец SQL не найден: добавлен ранее в программу - PullRequest
2 голосов
/ 05 января 2012

Я использую SQL Server 2008. У меня есть хранимая процедура с кодом, который выглядит следующим образом:

if not exists (select column_name from INFORMATION_SCHEMA.columns
where table_name = 'sample_table' and column_name = 'sample_column')    
    BEGIN
        ALTER TABLE Sample_Table
        ADD Sample_Column NVARCHAR(50)
    END

Update dbo.Sample_Table
SET Sample_Column = '1'

При выполнении я получаю сообщение об ошибке «Столбец не найден», поскольку столбец изначально не существует в Sample_Table - он добавлен в процедуру. Какой правильный способ обойти это?

Мой обходной путь (ниже) - заключить оператор обновления в оператор EXEC, чтобы он был вынужден создать код и выполнить его после шага ALTER TABLE. Но есть ли лучший метод?

EXEC ('
Update dbo.Sample_Table
SET Sample_Column = ''1'' ')

1 Ответ

1 голос
/ 06 января 2012

Если вам не очень нравится ваш обходной путь, кажется, что единственная другая опция - это отделить вашу логику DDL от логики DML, т.е. один SP будет проверять / создавать столбец (возможно, другие столбцы тоже, если необходимо), другой SP устанавливает значение (я).

С другой стороны, похоже, что вы используете оператор UPDATE просто для предоставления значения по умолчанию для вновь создаваемого столбца. Если это так, вы можете рассмотреть совершенно другое решение: создать ограничение DEFAULT (нет необходимости в операторе UPDATE). Здесь:

if not exists (select column_name from INFORMATION_SCHEMA.columns
where table_name = 'sample_table' and column_name = 'sample_column')    
    BEGIN
        ALTER TABLE Sample_Table
        ADD Sample_Column NVARCHAR(50) NOT NULL
        <b>CONSTRAINT DF_SampleTable_SampleColumn DEFAULT ('1');

        ALTER TABLE Sample_Table
        ALTER COLUMN Sample_Column NVARCHAR(50) NULL;</b>
    END

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

...