2013-07-09 5 views
25

SQLのテーブルが存在するかどうかを確認する必要があります。テーブルが存在するかどうかをチェックする際にOBJECT_IDが使用される理由

そうでなければ自動的に作成する必要があります。

は、今私は、このコーディングを調査した:それはどこobject_id = OBJECT_IDと私はその場所に何を置くべきと言う理由

IF NOT EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[YourTable]') AND type in (N'U')) 

BEGIN 
CREATE TABLE [dbo].[YourTable](
.... 
.... 
.... 
) 

END 

誰も説明できますか?

+2

は疑問がOBJECT_IDが何であるかを尋ねることが表示されませんが、でも、このインスタンスでは全く使用されている理由。興味深い質問ですが、これはうまくいくと思われるからです。「IF NOT EXISTS(SELECT * FROM sysobjects WHERE name = 'YourTable')... ' –

+1

sys.objectsのスキーマは、スキーマのシステムビュー - OBJECT_ID()関数は文字列を解析し、正しいobjectIDを取得します(すべてのオブジェクトはSQL Serverで一意のIDを持ちます)。そして、OBJECT_ID()に渡す文字列にスキーマ名を含めることができます。 IMHO - これを行うためのより宣言的な方法は、ISOビューINFORMATION_SCHEMA.TABLESを使用しています(これは私が与えて回答しました) –

+5

'IF OBJECT_ID(N '[dbo]。[YourTable]'、 'U')IS NOT NULL '十分です。 'sys.objects'に対するクエリは不必要です。 –

答えて

0
object_id = OBJECT_ID(N'[dbo].[YourTable]') 

object_idsys.objects

OBJECT_IDの列名は、指定したオブジェクト、つまりYourTableためIDを返す関数です。

YourTableのobject_idとsys.objectsテーブルのobject_idの列を比較しています。チェックするテーブル名が既に存在する場合は、YourTableを置き換える必要があります。

+0

私はこのようにしなければなりません: – user2564223

+1

@ user2564223 - '[dbo]。[YourTable] 'を' [dbo]に置き換えてください。[THETABLEYOUNEEDTOCHECKEXISTSORNOT] ' –

+0

ここでobject_id = OBJECT_ID(N '[dbo]。[Pastel_Companies]')と入力してください(N'U ') – user2564223

1

OBJECT_ID()は、オブジェクトIDを返す関数です。ドキュメントを参照してください。

スキーマスコープの オブジェクトのデータベースオブジェクト識別番号を返します。それを特定のパラメータを渡すことによって


http://msdn.microsoft.com/en-us/library/ms190328.aspx (すなわち。あなたのテーブルの詳細)、それはIDを返します。これをsys.objectsテーブルのIDと比較して、現在存在するかどうかを確認できます。テーブル・レベルのオブジェクトの存在を確認するための

6

ISO SQLの道INFORMATION_SCHEMA.TABLESが

を表示さINFORMATION_SCHEMA.TABLESは少しより宣言であるsys.objectsを見ていると間違っているけど....何はありません - それは、私はこれはおそらくかかわらず、新たなコーダのために、より読みやすいと思います(多くの場合、全く問題ありませんが、素敵な、まだMEH。)、クロスプラットフォーム

だ。心配しないでください

DECLARE @tableName SYSNAME = 'tbfoo' 
DECLARE @schemaNAme SYSNAME = 'fooSchema' 

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tableName AND TABLE_SCHEMA = @schemaName) 
BEGIN 
    RAISERROR('%s exists in schema: %s', 0, 1, @tableName, @schemaName) 
END 
ELSE 
BEGIN 
    RAISERROR('%s DOES NOT EXIST in schema: %s', 0, 1, @tableName, @schemaName) 
END 

RAISERRORコマンドについて - フォーマットされたメッセージを印刷する単なる素晴らしい方法です。

INFORMATION_SCHEMAビューを照会して、その内容を知ることができます。

SELECT TOP 5 * FROM INFORMATION_SCHEMA.TABLES 

あなたが見ることができるように - あなたは名前でスキーマやカタログを参照するのではなくOBJECT_ID(とそのIDを検索することができます)

58

私はこの構文を好き:

OBJECT_IDがかかる
if(object_id(N'[dbo].[YourTable]', 'U') is not null) 
... 

2番目のパラメータとしてオブジェクトの2 char型。あなたはsys.objects documentationに、下記のオブジェクトの種類のリストを見つけることができます。

  • AF =集計関数(CLR)
  • C = CHECK制約
  • D = DEFAULT(制約またはスタンドアロン)
  • F = FOREIGN KEY制約
  • FN = SQLスカラー関数
  • FS =アセンブリ(CLR)スカラー関数
  • FT =アセンブリ(CLR)テーブル値関数0 IF = SQLインラインテーブル値関数
  • 、内部テーブルをプロシージャ
  • PC =アセンブリ(CLR)ストアド
  • P = SQLストアドプロシージャを=
  • PG =プランガイド
  • PK = PRIMARY KEY制約
  • R =ルール(旧形式、スタンドアロン)
  • RF =レプリケーションフィルタ-手順
  • S =システムBA SEテーブル
  • SN =シノニム
  • SO = Sequenceオブジェクト
  • SQ =サービスキュー
  • TA =アセンブリ(CLR)DMLトリガー
  • TF = SQLテーブル値関数
  • TR = SQL DMLトリガー
  • TT =表型
  • U =表(ユーザ定義)
  • UQ = UNIQUE制約
  • V =ビュー
  • X =拡張ストアドプロシージャ
関連する問題