2009-07-20 5 views
1

私のBAチームにスキーマを提示したいと思います。サンプルSQLデータ

Select TABLE_NAME, col.DATA_TYPE 
from INFORMATION_SCHEMA.COLUMNS col 
order by col.TABLE_CATALOG, TABLE_NAME, TABLE_SCHEMA, col.ORDINAL_POSITION 

は、私は同様にサンプルデータの3行を提示したいが、私はそれを旋回するように望んでいたので、彼ら取得するには、次の3つの列がある出力:

  1. TABLE_NAME
  2. DATA_TYPE
  3. Sample_Data

どのようにデータをピボットするのですか?

SELECT TOP 3 * 
FROM mytable 
FOR XML AUTO 

をしてpresenation層における結果XMLを解析:

答えて

0

私は新しいクエリエディタウィンドウにこのクエリの結果をコピー&ペーストこの使用してXML PATH

SET NOCOUNT ON 

SELECT 
    'SELECT ''' + col.TABLE_NAME + ''' AS TableName,' + 
    '''' + col.COLUMN_NAME + ''' AS ColumnName,'+ 
    ' ''' + col.DATA_TYPE + ''' as DataType, ' + 
    ' 
    (
     SELECT top 3 CONVERT (VARCHAR, p2.' + col.COLUMN_NAME + ') + '','' 
     FROM ' + col.TABLE_SCHEMA + '.' + col.TABLE_NAME + ' p2 
     ORDER BY p2. ' + col.COLUMN_NAME + ' 
     FOR XML PATH('''') 
    ) 
    UNION ALL' 
FROM INFORMATION_SCHEMA.COLUMNS col 
ORDER BY 
    col.TABLE_CATALOG, 
    col.TABLE_NAME, 
    col.TABLE_SCHEMA, 
    col.ORDINAL_POSITION 

を構築しました。最後のUNION ALLを削除してクエリを実行します。

返されたデータにカンマが追加されますが、私のB.A.はそれで問題ありません。

0

あなたは、動的に各テーブルに対して、このようなクエリを構築することができます。

+0

@Quassnoi:T-SQLクエリですべてを提示してから、Excelにペーストをコピーしたいと思います。 –

+0

私はこれまでT-SQL XMLコードスニペットを見てきましたが、今はそれを見つけることができません。 –

1

ここには、カーソルと動的SQLに基づくソリューションがあります。私はテーブルのスキーマと列の名前を最終結果に含めましたが、質問はテーブル名、データ型、およびサンプルデータを要求します。

また、テーブル/列ごとに3行のサンプルデータを必要とするかどうか、または3列のサンプルデータで1つのテーブル/列に1つの行を追加するかどうかはわかりませんでした。私は前者と一緒に行きました、あなたが後でしたいのなら教えてください。私はサンプルデータを持たないテーブルのための "No data"インジケータを含めました。

SQL Server 2005でテストしましたが、2000と同様に動作するはずです。

Create Table #results 
    (id   Integer  Not Null Identity(1, 1) 
    ,table_schema nVarChar(128) Not Null 
    ,table_name nVarChar(128) Not Null 
    ,column_name nVarChar(128) Not Null 
    ,data_type nVarChar(128) Not Null 
    ,sample_data nVarChar(max)  Null); 

Declare @table_name nVarChar(128) 
     ,@table_schema nVarChar(128) 
     ,@column_name nVarChar(128) 
     ,@data_type nVarChar(128) 
     ,@sql   nVarChar(max) 
     ,@inserted  Integer; 

Declare rs Cursor Local Forward_Only Static Read_Only 
For Select 
     col.table_schema 
     ,col.table_name 
     ,col.column_name 
     ,col.data_type 
    From INFORMATION_SCHEMA.COLUMNS col 
    Order By col.TABLE_CATALOG 
      ,col.TABLE_SCHEMA 
      ,col.TABLE_NAME 
      ,col.ORDINAL_POSITION 
Open rs; 

Fetch Next From rs Into @table_schema, @table_name, @column_name, @data_Type; 
While @@Fetch_Status = 0 Begin; 

    Set @table_schema = QuoteName(@table_schema); 
    Set @table_name = QuoteName(@table_name); 
    Set @column_name = QuoteName(@column_name); 

    Set @sql = N' 
    Insert Into #results 
     (table_schema 
     ,table_name 
     ,column_name 
     ,data_type 
     ,sample_data) 
    Select Top 3 ' + QuoteName(@table_schema, '''') + N' 
       ,' + QuoteName(@table_name, '''') + N' 
       ,' + QuoteName(@column_name, '''') + N' 
       ,' + QuoteName(@data_type, '''') + N' 
       ,' + @column_name + N' 
    From ' + @table_schema + N'.' + @table_name; 

    Exec (@sql); 

    Select @inserted = count(*) 
    From #results 
    Where table_schema = @table_schema 
    And table_name = @table_name 
    And column_name = @column_name; 

    If @inserted = 0 
     Insert Into #results (table_schema, table_name, column_name, data_type, sample_data) 
     Values (@table_schema, @table_name, @column_name, @data_type, ' -- No Data -- '); 

    Fetch Next From rs Into @table_schema, @table_name, @column_name, @data_Type; 
End; 

Close rs; 
Deallocate rs; 

-- Probably should include the schema and column name too: 
Select table_schema, table_name, column_name, data_type, sample_data 
From #results 
Order by [id]; 

-- But this is what the question asked for: 
-- Select table_name, data_type, sample_data 
-- From #results 
-- Order by [id]; 

Drop Table #results; 

おそらくより洗練されたソリューションがありますが、これはあなたが始めているはずです。がんばろう!