2014-01-28 3 views
0

Я видел несколько ответов на это, но никто, кажется, соответствуютPivot в T-SQL без агрегирования или точного соответствия колонок

У меня есть большой БД с большим количеством таблиц, которые по существу являются такими же, как друг с другом - однако в какой-то момент в прошлом новые столбцы были добавлены/переименованы/удалены.

Я пытаюсь использовать INFORMATION_SCHEMA.COLUMNS, чтобы получить список столбцов для каждой целевой таблицы, но в сводном формате - поэтому имя таблицы находится сверху и ординальное положение в виде строк.

С помощью этих таблиц

CREATE TABLE tbl1 (
    Id int 
, Code int 
, GroupName varchar(25) 
, Amount money 
, OutstandingAmount money 
, DataDate date 
) 
ON [PRIMARY] 

CREATE TABLE tbl2 (
     Id int 
    , Code int 
    , CompanyName varchar(25) 
    , CompanyRegistrationDate date 
    , Amount money 
    , OutstandingAmount money 
    , DataDate date 
) 
ON [PRIMARY] 

CREATE TABLE tbl3 (
     Id int 
    , Code int 
    , CustomerId varchar(10) 
    , CustomerName varchar(25) 
    , Amount money 
    , OutstandingAmount money 
    , DataDate date 
) 
ON [PRIMARY] 

Тогда следующий запрос получает меня данные, и я могу с & р в первенствует выстраиваться колонны.

select 
    c.ORDINAL_POSITION 
    , c.TABLE_NAME 
    , c.COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS c 
WHERE TABLE_NAME LIKE 'tbl%' 


ORDINAL_POSITION TABLE_NAME COLUMN_NAME 
1 tbl1 Id 
2 tbl1 Code 
3 tbl1 GroupName 
4 tbl1 Amount 
5 tbl1 OutstandingAmount 
6 tbl1 DataDate 
1 tbl2 Id 
2 tbl2 Code 
3 tbl2 CompanyName 
4 tbl2 CompanyRegistrationDate 
5 tbl2 Amount 
6 tbl2 OutstandingAmount 
7 tbl2 DataDate 
1 tbl3 Id 
2 tbl3 Code 
3 tbl3 CustomerId 
4 tbl3 CustomerName 
5 tbl3 Amount 
6 tbl3 OutstandingAmount 
7 tbl3 DataDate 

Однако, в действительности есть 100 из таблиц (система создана) так с & р не очень разумный вариант.

Моя проблема также в том, что количество столбцов является непоследовательным.

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

ORDINAL_POSITION tbl1    tbl2      tbl3 
    1    Id     Id       Id 
    2    Code    Code      Code 
    3    GroupName   CompanyName     CustomerId 
    4    Amount    CompanyRegistrationDate  CustomerName 
    5    OutstandingAmount Amount      Amount 
    6    DataDate   OustandingAmount   OustandingAmount 
    7    NULL    DataDate     DataDate 
+0

Если он собирается возвращать неизвестное количество таблиц, то вы не можете записать его как простой стержень, так как любой заданный запрос должен возвращать фиксированный набор столбцов. Вам нужно будет построить запрос динамически. –

ответ

0

Пользователь также может использовать представления каталогаsys.tables или sys.columns вместо INFORMATION_SCHEMA.COLUMNS

Попробуйте это: -

DECLARE @cols AS NVARCHAR(MAX); 
    DECLARE @query AS NVARCHAR(MAX); 

    select @cols = STUFF((SELECT distinct ',' + 
        QUOTENAME(t.name) 
        FROM sys.tables t 
        inner join sys.columns c 
        on c.object_id=t.object_id 
        where t.name like 'tb%' 
        FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
        , 1, 1, ''); 
--Select @cols 
SELECT @query = 
       'SELECT * 
       FROM 
       ( 
       select t.name as TableName, 
         c.name ColumnName, 
         row_number() over (PARTITION BY T.OBJECT_id order by T.NAME) as ID 
       from sys.tables t 
       inner join sys.columns c 
       on c.object_id=t.object_id 
        where t.name like ''tb%'' 
       ) AS t 
       PIVOT 
       (
       MAX(ColumnName) 
       FOR TableName IN(' + @cols + ')' + 
       ') AS p ; '; 
     execute(@query); 
+0

Не хватает чего-то в конце? Не дает мне никаких результатов. – BlueChippy

+0

моя ошибка 'Execute (@query)' отсутствовала. – praveen

+0

Работает отлично :) – BlueChippy

Смежные вопросы