Что не так с этим TSQL? - PullRequest
2 голосов
/ 21 июля 2011

При выполнении следующего сценария я получаю сообщение об ошибке:

Сообщение 207, Уровень 16, Состояние 1, Строка 15 Неверное имя столбца 'b'.

Кто-нибудь может объяснить это, пожалуйста?Спасибо.

DROP TABLE ttt;
CREATE TABLE ttt(a nvarchar)

IF NOT EXISTS ( SELECT  *
                FROM    sys.columns
                WHERE   object_id = OBJECT_ID('dbo.ttt')
                        AND name = 'b' )
    AND EXISTS ( SELECT *
                 FROM   sys.columns
                 WHERE  object_id = OBJECT_ID('dbo.ttt')
                        AND name = 'a' ) 
    BEGIN

        ALTER TABLE [dbo].ttt ADD b NVARCHAR

        UPDATE  [dbo].ttt
        SET     b = a

        ALTER TABLE [dbo].ttt DROP COLUMN a
    END

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Если вы поместите код в хранимую процедуру, он должен работать. Просто убедитесь, что таблица существует с обоими столбцами a и столбцом b при создании процедуры. Затем, после создания процедуры, вы можете удалить таблицу и протестировать ее.

2 голосов
/ 21 июля 2011

Он пытается скомпилировать все эти операторы перед выполнением 1-го:

 ALTER TABLE [dbo].ttt ADD b NVARCHAR

    UPDATE  [dbo].ttt
    SET     b = a

    ALTER TABLE [dbo].ttt DROP COLUMN a

(На самом деле, он пытается скомпилировать весь пакет , не только эти операторы, но точка все еще остается - в момент, когда он пытается скомпилировать UPDATE, столбец не существует)

Когда он пытается скомпилировать оператор UPDATE, он просматривает метаданные таблицы и правильно находит, что столбец не существует.

Попробуйте EXEC оператор обновления.

    EXEC('UPDATE  [dbo].ttt
    SET     b = a');

А также то, что Одед говорит о том, что вы, вероятно, хотите указать размер столбца (в противном случае по умолчанию используется самый бессмысленный тип данных - nvarchar(1))


Этот скрипт определенно работает без ошибок:

CREATE TABLE ttt(a nvarchar)

IF NOT EXISTS ( SELECT  *
                FROM    sys.columns
                WHERE   object_id = OBJECT_ID('dbo.ttt')
                        AND name = 'b' )
    AND EXISTS ( SELECT *
                 FROM   sys.columns
                 WHERE  object_id = OBJECT_ID('dbo.ttt')
                        AND name = 'a' ) 
    BEGIN

        ALTER TABLE [dbo].ttt ADD b NVARCHAR

        EXEC('UPDATE  [dbo].ttt
        SET     b = a');

        ALTER TABLE [dbo].ttt DROP COLUMN a
    END
...