2017-08-11 173 views
0

关于与this question:我尝试使用下面的查询我的SQL Server查询,如果表不存在识别

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.."部分作品,但如果该表已经存在,程序在执行期间引发错误:看起来“if not exists”语句不起作用。任何人都有解释?

随意问更多细节

Teh error <3

+0

'和t.name = my_table'似乎缺少引号。除此之外,我无法复制您的问题:此声明不会尝试创建已存在的表。 'IF(OBJECT_ID('dbo.mytable','U')IS NULL)'是一个较短的选择。你是否试图在错误的数据库中执行这条语句,或者在没有权限对该表执行任何操作的帐户下执行该语句? –

+0

您还需要创建一个表格作为CREATE TABLE my_table ... – Leonidas199x

+0

@ Leonidas199x我没有复制这篇文章,因为这部分似乎工作,但查询的其余部分存在x) –

回答

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; 

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

您也可以使用OBJECT_ID功能有3部分组成的名称:

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

无法使用此代码复制:

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 

如果不工作,你可以告诉你的是什么版本运行和提供的确切消息?

+0

我怎样才能看到我正在运行的版本?我正在使用Microsoft Visual Studio 2015,但idk为sql服务器。 –

+0

运行 - SELECT @@ VERSION在SSMS中 – Leonidas199x