72

SQL Server (2008) で自分のテーブルに関する情報を抽出する方法を見つけようとしています。
必要なデータには、テーブルの説明 ([プロパティ] ウィンドウの [説明] プロパティから入力)、そのテーブルのフィールドのリスト、およびそれぞれのデータ型を含める必要があります。

そのようなメタデータを抽出する方法はありますか? いくつかのspを使用する必要があると思いますsysが、どれがわかりません。

4

16 に答える 16

86

説明データを取得するには、残念ながら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を連結する必要があります-それで、ポイントは何でしょうか?

于 2009-05-20T11:35:34.300 に答える
39

テーブルと列に関する一般的な情報は、次のテーブルで確認できます。

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'
于 2009-05-20T11:26:19.950 に答える
10

あなたは試すことができますsp_help <Name of object>

于 2009-05-20T12:31:38.583 に答える
7

@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
于 2015-06-19T16:23:02.473 に答える
5

オブジェクトカタログビューの使用:

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
于 2010-10-12T00:42:08.577 に答える
3

必要なメタデータの量に応じて、これは私にとってはうまくいきます: 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
于 2013-08-05T01:29:30.947 に答える
2

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));
                }
            }
于 2012-10-05T15:21:27.900 に答える
0
  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'
于 2013-08-02T11:47:59.107 に答える
0

.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 を使用すると実行できます)。

于 2012-03-13T22:45:21.007 に答える
0
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
于 2014-11-05T12:16:42.250 に答える
0

便利な方法で情報を表示したいだけなら、Red Gate の SQL Prompt が役立つかもしれません。

クエリ ウィンドウでオブジェクト テキストにカーソルを合わせると、SQL プロンプトのツールヒントに MS_Description 拡張プロパティ テキストが表示されます。ツールチップをクリックすると、列情報とオブジェクトの DDL を表示するダイアログが開きます。

http://www.red-gate.com/products/sql-development/sql-prompt/

于 2011-01-02T18:01:08.810 に答える