web-dev-qa-db-ja.com

列データ型のSQLServerメタデータはどこにありますか?

次の方法で列のプロパティにアクセスできることを知っています。

select * 
from sysobjects

ただし、私が見つけられないのは、列のタイプとタイプの長さを取得する場所に関する情報です。

FOO VARCHAR(80)

メタデータテーブルの型宣言の「VARCHAR(80)」部分はどこにありますか?

Systypesテーブルを調べてみましたが、xtypeの値がsysobjectsテーブルのxtypeの値と一致していません。

*これらのテーブルの作成に使用された元のSQLにアクセスできず、管理者権限もありません。

あなたがDB2に精通しているなら、私は同等のものを探しています

select name,
       coltype,
       length,
  from sysibm.syscolumns
where tbname = 'FOO'
13
avgvstvs

あなたは近くにいます。 _sys.columns_を見て列を取得できます。

OBJECT_ID=OBJECT_ID('dbo.Foo')を使用してテーブルをフィルタリングできます。

長さは_sys.columns_から取得できます。データ型は_system_type_フィールドにあります。そのフィールドのキーは_sys.types_にあります。

全体として、次のことができます。

_select object_NAME(c.object_id), c.name, t.name, c.max_length
from sys.columns c
INNER JOIN sys.types t
    ON t.system_type_id = c.system_type_id
_

補足として、SQL Serverではシステムテーブルは非推奨になり(つまり、syscolumnssysobjects)、代わりにビューを使用することをお勧めします。_sys.columns_、_sys.objects_など。

これにより、それぞれのテーブル、列、データ型、および最大長がわかります。

17
JNK

これを行う正しい方法は、sys.typesテーブルのuser_ type_idに参加することです。

select object_NAME(c.object_id), c.name, t.name, c.max_length
from sys.columns c
INNER JOIN sys.types t
    ON t.user_type_id = c.user_type_id

user_type_idは、システムタイプのsystem_type_idと同じです-ドキュメントを参照してください: https://msdn.Microsoft.com/en-gb/library/ms188021.aspx

7
Allan Bowe

上記の回答に基づいて構築するには、列を宣言する必要があるのと同じ形式で列のデータ型を取得すると便利なことがよくあります。

たとえば、varchar(50)varchar(max)decimal(p, s)

これにより、次のことが可能になります。

SELECT 
  [Name]         = c.[name]
, [Type]         = 
    CASE 
      WHEN tp.[name] IN ('varchar', 'char') THEN tp.[name] + '(' + IIF(c.max_length = -1, 'max', CAST(c.max_length AS VARCHAR(25))) + ')' 
      WHEN tp.[name] IN ('nvarchar','nchar') THEN tp.[name] + '(' + IIF(c.max_length = -1, 'max', CAST(c.max_length / 2 AS VARCHAR(25)))+ ')'      
      WHEN tp.[name] IN ('decimal', 'numeric') THEN tp.[name] + '(' + CAST(c.[precision] AS VARCHAR(25)) + ', ' + CAST(c.[scale] AS VARCHAR(25)) + ')'
      WHEN tp.[name] IN ('datetime2') THEN tp.[name] + '(' + CAST(c.[scale] AS VARCHAR(25)) + ')'
      ELSE tp.[name]
    END
, [RawType]      = tp.[name]
, [MaxLength]    = c.max_length
, [Precision]    = c.[precision]
, [Scale]        = c.scale
FROM sys.tables t 
JOIN sys.schemas s ON t.schema_id = s.schema_id
JOIN sys.columns c ON t.object_id = c.object_id
JOIN sys.types tp ON c.user_type_id = tp.user_type_id
WHERE s.[name] = 'dbo' AND t.[name] = 'MyTable'
1
MgSam