2017-03-28 7 views
0

開発データベースをローカルにスクリプト化しました。私たちのアプリケーションのストアドプロシージャには、テーブルが存在するかどうかを確認するコードがあります。コードがあれば、テーブルを削除して再作成します。私は、自分のローカルデータベースにコードを実行すると、テーブルが存在するかどうかを確認するチェックが開発時と同じように動作しないことに気付きました。特に、OBJECTPROPERTY(ID、N'IsUserTable ')はローカルで実行しているときにNULLを返しますが、DEVには1を返します。矛盾した結果: "select * from sysobjects ID = object_ID(N'TableName ')および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. 
. 

私は、チェックを変更した場合、それが動作することを

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) 

各テーブルのテーブルをスクリプト化すると、同じに見えます。違いを説明できるのは何ですか?

+0

あなたはこの答えを考えがあります。http: //dba.stackexchange.com/a/27953 – Forty3

答えて

1

現在発生している問題は、OBJECTPROPERTYが現在のデータベースにスコープされていることです。むしろあなたがまたしてクエリを簡素化することができ、あなたのOBJECT_IDコール(そうOBJECT_ID(N'Database.Schema.ObjectName', 'U') Uはユーザテーブルを表し、(あなたがsys.objectstype列から関連OBJECT_TYPEの値を確認することができます)。

にOBJECT_TYPEオプションを使用することができます使用よりちょうどそう、再び照会する必要がそのデータベースにsys.objectsない、OBJECT_IDの存在をチェック

をこれはあなたのクエリになるだろう、次のようになります。

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 
関連する問題