SQL Server (2008) で自分のテーブルに関する情報を抽出する方法を見つけようとしています。
必要なデータには、テーブルの説明 ([プロパティ] ウィンドウの [説明] プロパティから入力)、そのテーブルのフィールドのリスト、およびそれぞれのデータ型を含める必要があります。
そのようなメタデータを抽出する方法はありますか? いくつかのspを使用する必要があると思いますsys
が、どれがわかりません。
SQL Server (2008) で自分のテーブルに関する情報を抽出する方法を見つけようとしています。
必要なデータには、テーブルの説明 ([プロパティ] ウィンドウの [説明] プロパティから入力)、そのテーブルのフィールドのリスト、およびそれぞれのデータ型を含める必要があります。
そのようなメタデータを抽出する方法はありますか? いくつかのspを使用する必要があると思いますsys
が、どれがわかりません。
説明データを取得するには、残念ながらsysobjects/syscolumnsを使用してIDを取得する必要があります。
SELECT u.name + '.' + t.name AS [table],
td.value AS [table_desc],
c.name AS [column],
cd.value AS [column_desc]
FROM sysobjects t
INNER JOIN sysusers u
ON u.uid = t.uid
LEFT OUTER JOIN sys.extended_properties td
ON td.major_id = t.id
AND td.minor_id = 0
AND td.name = 'MS_Description'
INNER JOIN syscolumns c
ON c.id = t.id
LEFT OUTER JOIN sys.extended_properties cd
ON cd.major_id = c.id
AND cd.minor_id = c.colid
AND cd.name = 'MS_Description'
WHERE t.type = 'u'
ORDER BY t.name, c.colorder
info-schemaでそれを行うことができますが、OBJECT_ID()を呼び出すためにetcを連結する必要があります-それで、ポイントは何でしょうか?
テーブルと列に関する一般的な情報は、次のテーブルで確認できます。
select * from INFORMATION_SCHEMA.TABLES
select * from INFORMATION_SCHEMA.COLUMNS
テーブルの説明は拡張プロパティであり、sys.extended_properties からクエリできます。
select
TableName = tbl.table_schema + '.' + tbl.table_name,
TableDescription = prop.value,
ColumnName = col.column_name,
ColumnDataType = col.data_type
FROM information_schema.tables tbl
INNER JOIN information_schema.columns col
ON col.table_name = tbl.table_name
AND col.table_schema = tbl.table_schema
LEFT JOIN sys.extended_properties prop
ON prop.major_id = object_id(tbl.table_schema + '.' + tbl.table_name)
AND prop.minor_id = 0
AND prop.name = 'MS_Description'
WHERE tbl.table_type = 'base table'
あなたは試すことができますsp_help <Name of object>
@Andomarの回答が一番気に入りましたが、列の説明も必要でした。以下は、それらも含めるように変更された彼のクエリです。(WHERE 句の最後の部分のコメントを外して、いずれかの説明が null でない行のみを返します)。
SELECT
TableName = tbl.table_schema + '.' + tbl.table_name,
TableDescription = tableProp.value,
ColumnName = col.column_name,
ColumnDataType = col.data_type,
ColumnDescription = colDesc.ColumnDescription
FROM information_schema.tables tbl
INNER JOIN information_schema.columns col
ON col.table_name = tbl.table_name
LEFT JOIN sys.extended_properties tableProp
ON tableProp.major_id = object_id(tbl.table_schema + '.' + tbl.table_name)
AND tableProp.minor_id = 0
AND tableProp.name = 'MS_Description'
LEFT JOIN (
SELECT sc.object_id, sc.column_id, sc.name, colProp.[value] AS ColumnDescription
FROM sys.columns sc
INNER JOIN sys.extended_properties colProp
ON colProp.major_id = sc.object_id
AND colProp.minor_id = sc.column_id
AND colProp.name = 'MS_Description'
) colDesc
ON colDesc.object_id = object_id(tbl.table_schema + '.' + tbl.table_name)
AND colDesc.name = col.COLUMN_NAME
WHERE tbl.table_type = 'base table'
--AND tableProp.[value] IS NOT NULL OR colDesc.ColumnDescription IS NOT null
オブジェクトカタログビューの使用:
SELECT T.NAME AS [TABLE NAME], C.NAME AS [COLUMN NAME], P.NAME AS [DATA TYPE], P.MAX_LENGTH AS[SIZE], CAST(P.PRECISION AS VARCHAR) +‘/’+ CAST(P.SCALE AS VARCHAR) AS [PRECISION/SCALE]
FROM ADVENTUREWORKS.SYS.OBJECTS AS T
JOIN ADVENTUREWORKS.SYS.COLUMNS AS C
ON T.OBJECT_ID=C.OBJECT_ID
JOIN ADVENTUREWORKS.SYS.TYPES AS P
ON C.SYSTEM_TYPE_ID=P.SYSTEM_TYPE_ID
WHERE T.TYPE_DESC=‘USER_TABLE’;
情報スキーマビューの使用
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION,
COLUMN_DEFAULT, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION, NUMERIC_PRECISION_RADIX, NUMERIC_SCALE,
DATETIME_PRECISION
FROM ADVENTUREWORKS.INFORMATION_SCHEMA.COLUMNS
必要なメタデータの量に応じて、これは私にとってはうまくいきます: Northwind.dbo.Products のような全体または製品だけ
SELECT c.name Field,
t.name Type,
c.Precision,
c.Scale,
c.is_nullable,
c.collation_name
FROM sys.columns c
INNER JOIN sys.types t ON t.system_type_id=c.system_type_id
WHERE object_id=object_id('<table to inspect>')
ORDER BY column_id
Javaコードを使用してクエリをプルする場合は、列名と列のプロパティ(タイプと長さ)を取得できるResultSetMetaDataという使用可能な優れたクラスがあります。
例
ResultSet rs = null;
rs = sql.executeQuery();
if (rs != null) {
if (rs.next()) {
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
System.out.println("column name: "
+ rsmd.getColumnName(i));
System.out.println("column size: "
+ rsmd.getColumnDisplaySize(i));
}
}
SELECT
sc.name AS ColumnName
,ep.*
FROM
sys.columns AS sc
INNER JOIN sys.extended_properties AS ep
ON ep.major_id = sc.[object_id]
AND ep.minor_id = sc.column_id
WHERE
--here put your desired table
sc.[object_id] = OBJECT_ID('[Northwind].[dbo].[Products]')
-- this is optional, remove this and you get all extended props
AND ep.name = 'MS_Description'
.NET コードを使用しても問題ない場合は、 SMO を使用することをお勧めします。msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.table.aspx これは、バージョン固有のシステム ビューとテーブルを使用するよりも移植性の高いソリューションです。
これが定期的に使用するものである場合は、おそらくランタイム T4 コード ジェネレーターhttp://msdn.microsoft.com/en-us/library/ee844259.aspxを使用して、単純なコンソール アプリケーションを作成することをお勧めします。
それが 1 回限りのタスクである場合は、オプションの XSLT 変換を使用して、私の LiveDoco ( http://www.livedoco.com ) の XML へのエクスポート機能を使用できます。または、これを実行できる無料のツールが世の中にあると確信しています。これは問題ないようです: http://sqldbdoc.codeplex.com/ - XSLT を介して XML をサポートしますが、選択したテーブルに対して実行できるかどうかはわかりません (LiveDoco を使用すると実行できます)。
select Col.name Columnname,prop.Value Description, tbl.name Tablename, sch.name schemaname
from sys.columns col left outer join sys.extended_properties prop
on prop.major_id = col.object_id and prop.minor_id = col.column_id
inner join sys.tables tbl on col.object_id = tbl.object_id
Left outer join sys.schemas sch on sch.schema_id = tbl.schema_id
便利な方法で情報を表示したいだけなら、Red Gate の SQL Prompt が役立つかもしれません。
クエリ ウィンドウでオブジェクト テキストにカーソルを合わせると、SQL プロンプトのツールヒントに MS_Description 拡張プロパティ テキストが表示されます。ツールチップをクリックすると、列情報とオブジェクトの DDL を表示するダイアログが開きます。
http://www.red-gate.com/products/sql-development/sql-prompt/