2017-03-28 5 views
0

Ich schrieb unsere Entwicklungsdatenbank lokal. Die Stored-Prozeduren in unserer App haben überall Code, der überprüft, ob eine Tabelle existiert, und falls dies der Fall ist, löscht sie die Tabelle und erstellt sie neu. Ich habe festgestellt, dass wenn ich den Code in meiner lokalen Datenbank ausführe, dass die Überprüfung, um zu sehen, ob die Tabelle vorhanden ist, nicht das gleiche wie wenn in Entwicklung ausgeführt wird. Insbesondere habe ich festgestellt, dass OBJECTPROPERTY (ID, N'IsUserTable ') bei lokaler Ausführung NULL zurückgibt, aber in DEV 1 zurückgibt.Inkonsistente Ergebnisse: "Wählen Sie * aus sysobjects wobei ID = Objekt_ID (N'TableName ') und OBJECTPROPERTY (ID, N'IsUserTable') = 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 

NO! 
Msg 2714, Level 16, State 6, Line 2 
There is already an object named 'CDB_SCRB_CLIENT_ACCOUNT' in the database. 
. 

Ich weiß, dass wenn ich den Scheck ändern

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] 

folgt, dass es funktionieren wird, aber ich will nicht nur viele Vorkommen dieses Codes ändern, zu laufen die App in meiner lokalen Datenbank.

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) 

Wenn ich die Tabellen in jeder Tabelle scripte, scheinen sie die gleichen zu sein. Was könnte den Unterschied erklären?

+0

Haben Sie diese Antwort angesehen: http: //dba.stackexchange.com/a/27953 – Forty3

Antwort

1

Das Problem, das auftritt, ist, dass OBJECTPROPERTY auf die aktuelle Datenbank beschränkt ist. Anstatt Gebrauch, dass Sie die object_type Option in Ihrem OBJECT_ID Aufruf verwenden könnten (so OBJECT_ID(N'Database.Schema.ObjectName', 'U') wo U für eine Benutzertabelle (Sie den entsprechenden object_type Wert aus der type Spalte in sys.objects überprüfen).

Sie können Ihre Abfrage vereinfachen, indem nur die Überprüfung für die Existenz des object_id, also wieder keine Notwendigkeit zur Abfrage in der Datenbank sys.objects

Dies würde Ihre Abfrage wie folgt aussehen machen.

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 
Verwandte Themen