【问题标题】:My SQL server query doesn't recognize if a table exists我的 SQL 服务器查询无法识别表是否存在
【发布时间】:2017-08-11 20:11:19
【问题描述】:

this question 相关:我正在尝试使用以下查询

IF NOT EXISTS(
    SELECT T.name FROM SYS.TABLES T JOIN SYS.SCHEMAS S ON (T.SCHEMA_ID = S.SCHEMA_ID) 
    WHERE S.NAME = 'DBO' AND T.NAME = 'sample2Prot'
    ) 
BEGIN CREATE TABLE[TCPDUMP].[dbo].[sample2Prot] 
    (
    [IdTransmission] INT IDENTITY(1, 1) NOT NULL,
    [timestp]  NVARCHAR(32) NULL,
    [idq]  NVARCHAR(32) NULL,
    [idz]  NVARCHAR(32) NULL,
    [prot]  NVARCHAR(32) NULL,
    [Lhowmany]  NVARCHAR(32) NULL,
    [Rhowmany]  NVARCHAR(32) NULL,
    CONSTRAINT[PK_TCPDump] PRIMARY KEY CLUSTERED([IdTransmission] ASC)
    ) 
END;

CREATE my_table.." 部分有效,但如果表已存在,则程序在执行期间会引发错误:似乎“如果不存在”语句不起作用。有人解释一下吗?

欢迎询问更多详情

【问题讨论】:

  • and t.name = my_table 似乎缺少引号。除此之外,我无法复制您的问题:此语句不会尝试创建已经存在的表。 IF (OBJECT_ID('dbo.mytable', 'U') IS NULL) 是一个较短的选择。您是在尝试在错误的数据库中执行此语句,还是在没有权限对表执行任何操作的帐户下执行此语句?
  • 您还需要创建一个表为 CREATE TABLE my_table...
  • @Leonidas199x 我没有在帖子中复制这个,因为这部分似乎有效,但查询的其余部分存在 x)
  • @JeroenMostert 通常我已经获得了所有权限..我暂时没有实现任何用户^^!
  • 你是在数据库TCPDUMPUSE TCPDUMP)中执行这个吗?如果不是,则检查将失败,因为系统视图的范围仅限于数据库。

标签: sql-server


【解决方案1】:

您提供的示例脚本不是有效的语法,所以我们只能猜测为什么您的实际脚本不能按预期工作,假设实际语法是有效的。我希望该方法可以工作,但可以重构如下:

IF OBJECT_ID(N'dbo.my_table', 'U') IS NULL
BEGIN
    CREATE TABLE dbo,my_table(col1 int);
END;

编辑: 您修改后的问题中的实际脚本显示表名与数据库名匹配,但系统目录视图不是。因此,将检查当前数据库是否存在对象,如果脚本从不同的数据库上下文运行并且表已经存在,您将收到错误消息。修改后的脚本是:

IF NOT EXISTS(
    SELECT T.name FROM TCPDUMP.sys.tables T JOIN TCPDUMP.sys.schemas S ON (T.SCHEMA_ID = S.SCHEMA_ID) 
    WHERE S.NAME = 'dbo' AND T.NAME = 'sample2Prot'
    ) 
BEGIN CREATE TABLE[TCPDUMP].[dbo].[sample2Prot] 
    (
    [IdTransmission] INT IDENTITY(1, 1) NOT NULL,
    [timestp]  NVARCHAR(32) NULL,
    [idq]  NVARCHAR(32) NULL,
    [idz]  NVARCHAR(32) NULL,
    [prot]  NVARCHAR(32) NULL,
    [Lhowmany]  NVARCHAR(32) NULL,
    [Rhowmany]  NVARCHAR(32) NULL,
    CONSTRAINT[PK_TCPDump] PRIMARY KEY CLUSTERED([IdTransmission] ASC)
    ) 
END;

另外,请注意本示例中系统目录视图和模式名称的小写。这将确保脚本在具有区分大小写排序规则的数据库上成功。

您还可以使用具有 3 部分名称的 OBJECT_ID 函数:

IF OBJECT_ID(N'TCPDUMP.dbo.my_table', 'U') IS NULL

【讨论】:

    【解决方案2】:

    无法使用此代码进行复制:

    IF NOT EXISTS(SELECT T.name FROM SYS.TABLES T JOIN SYS.SCHEMAS S ON (T.SCHEMA_ID = S.SCHEMA_ID) WHERE S.NAME = 'DBO' AND T.NAME = 'MY_TABLE') 
    
    BEGIN
        PRINT 'Creating table'
        CREATE TABLE MY_TABLE
        (
            ID INT 
        )
    END
    

    如果这不起作用,您能否告知您正在运行的版本以及显示的确切消息?

    【讨论】:

    • 如何查看我正在运行的版本?我正在使用 Microsoft Visual Studio 2015,但 idk 用于 sql server..
    • 运行 - 在 SSMS 中选择 @@VERSION
    猜你喜欢
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 2013-04-16
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    相关资源
    最近更新 更多