SQL запрос не выполняется полностью - PullRequest
0 голосов
/ 29 мая 2020

Итак, у меня есть запрос, который должен добавить первичный ключ в поле Id:

IF NOT EXISTS(SELECT * 
              FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
              WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'CAL')
BEGIN
    DROP INDEX IF EXISTS CAL$01 ON dbo.CAL;

    ALTER TABLE BTS.dbo.CAL
    ALTER COLUMN Intern INT NOT NULL;

    ALTER TABLE BTS.dbo.CAL
        ADD CONSTRAINT PK_CAL_Intern PRIMARY KEY (Intern);

    CREATE INDEX CAL$01
    ON CAL (Intern);
END

Проблема в том, что когда я выбираю весь этот код и выполняю (F5), я получаю эту ошибку:

enter image description here

В то время как, когда я выбираю каждый оператор один за другим, он работает, как ожидалось:

enter image description here

Я уверен, что IF работает должным образом

Я пытался использовать GO между операторами, это не разрешено.

Я должен выполнить этот код на большом количестве таблиц

Возможно, я чего-то не знаю о том, как SQL Server Management Studio выполняет операторы

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Перед выполнением запроса он анализируется. Вот почему то, что вы делаете, терпит неудачу. Сервер SQL проверяет детали Intern перед запуском скрипта. В тот момент, когда вы начинаете пытаться запустить сценарий, Intern в таблице BTS.dbo.CAL может NULL, поэтому сценарий не работает.

Вы можете обойти это, запустив оператор для создания cosntraint первичного ключа в отдельной области:

IF NOT EXISTS(
    SELECT * 
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'CAL'
)
BEGIN
    DROP INDEX IF EXISTS CAL$01 ON dbo.CAL;

    ALTER TABLE
      BTS.dbo.CAL
    ALTER COLUMN
      Intern
        INT NOT NULL;

    EXEC sys.sp_executesql N'ALTER TABLE BTS.dbo.CAL ADD CONSTRAINT PK_CAL_Intern PRIMARY KEY (Intern);';

    CREATE INDEX [CAL$01]
    ON CAL (Intern);
END'
1 голос
/ 29 мая 2020

Хотя вопрос есть ответ, я просто хотел добавить еще один вариант.

Вы можете разделить статистику на две отдельные партии, чтобы ваше изменение было доступно для следующей партии

CREATE TABLE #test(a int null);

-- DDL Changes
if exists(SELECT 1)
BEGIN

ALTER TABLE #test ALTER COLUMN a int not null;

END
GO

-- Index changes
if exists(SELECT 1)
BEGIN
    ALTER TABLE #test ADD CONSTRAINT PK_test PRIMARY KEY(a)
END
GO
...