Моя база данных SQL Server 2008 R2 развертывается из созданного мной проекта SSDT. Одно странное требование в этом случае — изменить один из столбцов первичного ключа на IDENTITY
или наоборот в зависимости от того, где он развернут. Я не в восторге от требования, но это не мой вопрос.
Что я сделал, так это настроил сценарий после развертывания, который должен запускаться условно, в зависимости от того, где происходит развертывание. Все идет нормально.
В моем сценарии я выполняю команду ALTER TABLE ADD
, чтобы настроить новый столбец, заполнить его и переименовать в старый столбец. После этого я пытаюсь сделать UPDATE
для нового столбца, и он дает сбой, потому что столбец не существует. Я помещаю оператор GO
прямо под команду ALTER TABLE ADD
, и когда я тестирую сценарий изолированно, это решает проблему, все работает отлично.
-- Add a clone of the ID column with no Identity constraint
ALTER TABLE Communication ADD CommunicationIdNoIdentity INT NOT NULL;
GO
UPDATE Communication
SET CommunicationIdNoIdentity = CommunicationID;
Однако кажется, что это недопустимо в контексте сценария после развертывания. С GO
на месте я получаю ошибку сборки прямо здесь:
Ошибка: SQL72007: сбой проверки синтаксиса «Произошел неожиданный конец файла». в партии рядом
Как я могу обойти это? BuildAction
в файле установлено значение «Нет», что я считаю правильным.
ОБНОВЛЕНИЕ: хотя ошибка исходит от дочернего скрипта, я, наконец, вернул ее родительскому. Если я сделаю это:
IF @IsDeploymentToDatacenter = 'TRUE'
:r .\FixIdColumnInCommunicationTable.SQL
оно работает. Если я сделаю это (то, что у меня было изначально), это приведет к ошибкам, которые я описал, среди прочего:
IF @IsDeploymentToDatacenter = 'TRUE'
BEGIN
:r .\FixIdColumnInCommunicationTable.SQL
END
GO
не является оператором или командой SQL. Это разделитель, используемый SQL Server Management Studio, и, следовательно, он недопустим в обычном универсальном SQL. сценарий - person marc_s   schedule 04.03.2015