【问题标题】:SQL query not executing as wholeSQL 查询没有整体执行
【发布时间】:2020-05-29 23:45:07
【问题描述】:

所以我有一个查询应该将主键添加到 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,这是不允许的。

我应该在大量表上执行这段代码

也许我对 SQL Server Management Studio 如何执行语句一无所知

【问题讨论】:

  • 执行语句的不是 MAnagement Studio,而是 DB 引擎。
  • DROP INDEX IF EXISTS 与 sqlserver 2016 一起出现 - 你使用的是什么版本?
  • 我得到了最后一个版本的 Management Studio,不久前我安装了它
  • SSMS 和 SQL Server 不是一回事,@ValeriuSeremet。 SSMS 的版本和 SQL Server 的版本通常是不相关的。例如,SSMS 2018 支持 SQL Server 2008-2019(即 7 个​​不同版本的 SQL Server)。
  • SQL Server 版本:15.0.2

标签: sql sql-server tsql


【解决方案1】:

在运行查询之前,它会被解析。这就是为什么你正在做的事情失败了。 SQL 服务器在脚本运行之前检查Intern 的详细信息。在您开始尝试运行脚本时,BTS.dbo.CAL 表中的InternNULLable,因此脚本失败。

您可以通过运行语句在单独的范围内创建主键 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'

【讨论】:

    【解决方案2】:

    即使问题是答案,我也只是想再添加一个选项。

    您可以将语句分成两个单独的批次,以便您的更改可用于后续批次

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 2018-02-01
      相关资源
      最近更新 更多