SQL Server 2008でユーザー定義テーブルタイプの存在を確認する方法


164

ユーザー定義のテーブルタイプがあります。パッチOBJECT_ID(name, type)機能で編集する前に、その存在を確認したい。

ユーザー定義のテーブルタイプに列挙typeから何を渡す必要がありますか?

N'U' ユーザー定義テーブルのように動作しません、すなわち IF OBJECT_ID(N'MyType', N'U') IS NOT NULL

回答:


188

sys.typesを調べるか、TYPE_IDを使用できます。

IF TYPE_ID(N'MyType') IS NULL ...

ただし、type_idを使用しても、型がテーブル型であることは確認されません。その名前の型が存在することが確認されます。そうでなければ、GBNのクエリはおそらくより良いです。


私は単純にIF OBJECT_ID(N'MyType', 'TT') IS NULL成功せずにしようとしましたが、あなたの解決策はうまくいきました。
Allon Guralnek 2013

1
'TT'列挙は、SQL Server 2012以降でのみ機能します(私が見つけたばかりです)
Iain

3
@Iain実際にはまだそうではありません。OBJECT_IDを使用して名前でテーブルタイプを検索することはできません-チェックアウトSELECT name FROM sys.objects WHERE type = 'TT'
NReilingh

109
IF EXISTS (SELECT * FROM sys.types WHERE is_table_type = 1 AND name = 'MyType')
    --stuff

sys.types ...それらはスキーマスコープのオブジェクトではないため、sys.objectsにはありません

更新、2013年3月

TYPE_IDも使用できます


5
2つ目のコメントは不正確だと思います。私が間違っていない場合、ユーザー定義型は確かにスキーマスコープです(これSchema_IDは実際には、リンクしたsys.typesテーブルの属性の1つです。これが、[dbo]。[myUDType]として参照できる理由です。 )。それでも、UDタイプがsys.objectsにリストされていないため、OBJECT_ID()でアクセスできないことは正しいです。(何らかの理由で、sys.objectsはスキーマスコープオブジェクトの完全なリストではありません。)
kmote

1
@kmote-それらはsys.objects直接リストされていませんが、それぞれに行があります
Martin Smith

20
IF EXISTS(SELECT 1 FROM sys.types WHERE name = 'Person' AND is_table_type = 1 AND SCHEMA_ID('VAB') = schema_id)
DROP TYPE VAB.Person;
go
CREATE TYPE VAB.Person AS TABLE
(    PersonID               INT
    ,FirstName              VARCHAR(255)
    ,MiddleName             VARCHAR(255)
    ,LastName               VARCHAR(255)
    ,PreferredName          VARCHAR(255)
);

スキーマもチェックするので、これはより完全な答えだと思います。
Hamid Heydarian、2018年

6

次の例は私にとってうまくいきます、「is_user_defined」ではなく「is_table_type」に注意してください

IF TYPE_ID(N'idType') IS NULL
CREATE TYPE [dbo].[idType] FROM Bigint NOT NULL
go

IF not EXISTS (SELECT * FROM sys.types WHERE is_user_defined = 1 AND name = 'idType')
CREATE TYPE [dbo].[idType] FROM Bigint NOT NULL
go

4

システムのtable_typesビューも使用できます

IF EXISTS (SELECT *
           FROM   [sys].[table_types]
           WHERE  user_type_id = Type_id(N'[dbo].[UdTableType]'))
  BEGIN
      PRINT 'EXISTS'
  END 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.