sql查询未作为整体执行

3qpi33ja  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(285)

因此,我有一个查询,应该将主键添加到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 ),我得到这个错误:

然而,当我一个接一个地选择每一个语句时,它都会像预期的那样工作:

我确信 IF 按预期工作
我试着用 GO 在陈述之间,这是不允许的。
我应该在大量的表上执行这个代码
也许我对SQLServerManagementStudio如何执行语句一无所知

9rbhqvlz

9rbhqvlz1#

在运行查询之前,将对其进行分析。这就是为什么你所做的是失败的。sql server正在检查 Intern 在脚本运行之前。当你开始尝试运行脚本时, Intern 在table上 BTS.dbo.CALNULL 所以脚本失败了。
可以通过运行语句在单独的作用域中创建主键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'
c3frrgcw

c3frrgcw2#

尽管问题就是答案,但我只想再增加一个选项。
您可以将语句分为两个单独的批,以便您的更改可用于后续批

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

相关问题