2009-07-20 59 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

我该如何调整这些数据?

回答

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

您可以动态地建立这样每个表的查询:

SELECT TOP 3 * 
FROM mytable 
FOR XML AUTO 

和分析在presenation层所产生的XML

+0

@Quassnoi:我想在T-SQL查询中展示所有内容,然后将粘贴复制到Excel中。 – 2009-07-20 15:18:33

1

这是一个基于游标和动态SQL的解决方案。我也在最终结果中包含了表格模式和列名,尽管这个问题只是询问表名,数据类型和示例数据。

此外,我不确定是否需要每个表/列的三行样本数据,或者如果您希望每列/三列的样本数据有一行。我和前者一起去了,请让我知道如果你想要后者。我确实为没有任何样本数据的表格添加了“无数据”指标。

在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; 

有可能是更优雅的解决方案,但这应该让你开始,我想。祝你好运!