Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2012 不一致的结果:“从sysobjects中选择*,其中ID=object\u ID(N'TableName')和OBJECTPROPERTY(ID,N'IsUserTable')=1”_Sql Server 2012 - Fatal编程技术网

Sql server 2012 不一致的结果:“从sysobjects中选择*,其中ID=object\u ID(N'TableName')和OBJECTPROPERTY(ID,N'IsUserTable')=1”

Sql server 2012 不一致的结果:“从sysobjects中选择*,其中ID=object\u ID(N'TableName')和OBJECTPROPERTY(ID,N'IsUserTable')=1”,sql-server-2012,Sql Server 2012,我在本地编写了开发数据库的脚本。我们应用程序中的存储过程到处都是代码,用于检查表是否存在,如果存在,则删除表并重新创建它。我注意到,当我在本地数据库中运行代码时,检查表是否存在的工作方式与在开发中运行的工作方式不同。特别是,我注意到OBJECTPROPERTYID,N'IsUserTable'在本地运行时返回NULL,但在DEV中返回1 if exists (select * from [CLASS].DBO.sysobjects where ID = object_ID(N'[CLASS].D

我在本地编写了开发数据库的脚本。我们应用程序中的存储过程到处都是代码,用于检查表是否存在,如果存在,则删除表并重新创建它。我注意到,当我在本地数据库中运行代码时,检查表是否存在的工作方式与在开发中运行的工作方式不同。特别是,我注意到OBJECTPROPERTYID,N'IsUserTable'在本地运行时返回NULL,但在DEV中返回1

if exists (select * from [CLASS].DBO.sysobjects where ID = object_ID(N'[CLASS].DBO.[CDB_SCRB_CLIENT_ACCOUNT]') and OBJECTPROPERTY(ID, N'IsUserTable') = 1)
BEGIN
    PRINT 'EXISTS!'
    drop table [CLASS].DBO.[CDB_SCRB_CLIENT_ACCOUNT]
END
    ELSE PRINT 'NO!'
GO

CREATE TABLE [CLASS].DBO.[CDB_SCRB_CLIENT_ACCOUNT] (
    [CLIENT_ID] [bigint] NULL ,
    [CLIENT_Name] [char] (70) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    [GOC] [char] (3) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    [AC_DATE] [datetime] NULL ,
    [EFF_Date] [datetime] NULL ,
    [AC_STATUS] [char] (8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [REPORTING_DATE] [datetime] NULL,
    [V2V_IND] [char] (1) NULL,  --2017.10
    [LAST_OPER_ID] [char] (8) NULL,
    [LAST_TIMESTAMP] [datetime] NULL
) ON [PRIMARY]
GO
我知道如果我按如下方式更改支票

if exists (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CDB_SCRB_CLIENT_ACCOUNT]') AND type in (N'U'))
drop table [CLASS].DBO.[CDB_SCRB_CLIENT_ACCOUNT]
它将工作,但我不想改变这段代码的许多地方只是为了在我的本地数据库上运行应用程序

SELECT @@version --on dev server
Microsoft SQL Server 2012 (SP3-CU7) (KB3205051) - 11.0.6579.0 (X64) 
    Dec 22 2016 11:18:09 
    Copyright (c) Microsoft Corporation
    Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

SELECT @@version --on local workstation
Microsoft SQL Server 2012 (SP1) - 11.0.3156.0 (X64) 
    May  4 2015 18:48:09 
    Copyright (c) Microsoft Corporation
    Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

当我为每个表中的表编写脚本时,它们看起来是相同的。什么能解释这种差异

您遇到的问题是OBJECTPROPERTY的作用域是当前数据库。不使用该选项,您可以在对象ID中使用对象类型选项,因此可以调用对象ID'Database.Schema.ObjectName','U',其中U表示用户表,您可以从中的类型列中检查相关的对象类型值

您还可以通过检查object_id的存在来简化查询,因此无需再次查询该数据库中的sys.objects

这将使您的查询如下所示:

IF (SELECT object_ID(N'[CLASS].DBO.[CDB_SCRB_CLIENT_ACCOUNT]', 'U')) IS NOT NULL
BEGIN
    PRINT 'EXISTS!'
    drop table [CLASS].DBO.[CDB_SCRB_CLIENT_ACCOUNT]
END
    ELSE PRINT 'NO!'
GO

CREATE TABLE [CLASS].DBO.[CDB_SCRB_CLIENT_ACCOUNT] (
    [CLIENT_ID] [bigint] NULL ,
    [CLIENT_Name] [char] (70) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    [GOC] [char] (3) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    [AC_DATE] [datetime] NULL ,
    [EFF_Date] [datetime] NULL ,
    [AC_STATUS] [char] (8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [REPORTING_DATE] [datetime] NULL,
    [V2V_IND] [char] (1) NULL,  --2017.10
    [LAST_OPER_ID] [char] (8) NULL,
    [LAST_TIMESTAMP] [datetime] NULL
) ON [PRIMARY]
GO

你有没有考虑过这个答案:
IF (SELECT object_ID(N'[CLASS].DBO.[CDB_SCRB_CLIENT_ACCOUNT]', 'U')) IS NOT NULL
BEGIN
    PRINT 'EXISTS!'
    drop table [CLASS].DBO.[CDB_SCRB_CLIENT_ACCOUNT]
END
    ELSE PRINT 'NO!'
GO

CREATE TABLE [CLASS].DBO.[CDB_SCRB_CLIENT_ACCOUNT] (
    [CLIENT_ID] [bigint] NULL ,
    [CLIENT_Name] [char] (70) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    [GOC] [char] (3) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    [AC_DATE] [datetime] NULL ,
    [EFF_Date] [datetime] NULL ,
    [AC_STATUS] [char] (8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [REPORTING_DATE] [datetime] NULL,
    [V2V_IND] [char] (1) NULL,  --2017.10
    [LAST_OPER_ID] [char] (8) NULL,
    [LAST_TIMESTAMP] [datetime] NULL
) ON [PRIMARY]
GO