Образец данных SQL - PullRequest
       2

Образец данных SQL

1 голос
/ 20 июля 2009

Я хочу представить схему моей команде BA.

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

Как мне изменить эти данные?

Ответы [ 3 ]

1 голос
/ 20 июля 2009

Вот решение, основанное на курсорах и динамическом 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;

Возможно, есть более элегантные решения, но я думаю, это должно помочь вам начать. Удачи!

0 голосов
/ 20 июля 2009

Я построил это, используя 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 и выполняю запрос.

Это дает мне дополнительную запятую в Возвращенных данных, но мои Б.А. были в порядке с этим.

0 голосов
/ 20 июля 2009

Вы можете динамически создавать подобные запросы для каждой таблицы:

SELECT  TOP 3 *
FROM    mytable
FOR XML AUTO

и проанализируйте полученный XML в слое представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...