2009-02-05 2 views
0

У меня есть таблица «datadump», в которой есть куча смешанных данных, связанных с производительностью. Что-то вроде:Извлечь имена столбцов из другой таблицы?

MachID TestDate MachType Value1 Value2 ... 
00001 01/01/09 Server 15  48  
00001 01/02/09 Server 16  99  
19999 01/01/09 Switch 32  4.9880 
19999 01/02/09 Switch 32  5.8109 

Хитрость заключается в том, что «ценности» столбцы MEAN разные вещи для разных типов машин. Таким образом, у нас есть таблица «перекодировки», который выглядит как:

MachType  Column Description 
Server   Value1 Users Connected 
Server   Value2 % CPU _total 
Switch   Value1 Number of Ports 
Switch   Value2 packets/ms 
... 

Я знаю, странные структуры, но я не сделал этого, и не может изменить его.

Я хотел бы как-то «внутреннее соединение», чтобы я мог запросить соответствующие заголовки столбцов на основе типа данных. Нечто подобное для серверов:

MachID TestDate MachType Users Connected  % CPU _total Total RAM 
00001 01/01/09 Server 15     48    4096 
00001 01/02/09 Server 16     99    4096 

и это для переключателей:

MachID TestDate MachType Number of Ports packets/ms Total Cumulative kb 
19999 01/01/09 Switch 32    4.9880  1024547 
19999 01/02/09 Switch 32    5.8109  1029450 

Есть ли способ сделать это, не делая отдельные жестко закодированные запросы для каждого типа?

Примечание: мне нужно будет только запрашивать один тип объекта одновременно. Скорее всего, я буду рассматривать только результаты между конкретными датами для одного MachID, если это поможет. Это MS SQL 2000.

Спасибо!

ответ

0

Создайте таблицу, сохраняющую имя заголовка для каждого значения для этого индивидуального типа запроса.

Затем создайте хранимую процедуру и используйте Dynamic SQL для заполнения имени столбца, как показано на рисунке.

0

Поскольку вы не можете изменить модель данных, я бы предложил поместить код презентации в уровень презентации вашего приложения. У вас есть таблица, которая дает вам заголовки столбцов для использования на основе запрошенных результатов и оттуда.

1

Это сделает все вместе - вы можете изменить, если необходимо, чтобы все они были разделены.

DECLARE @template AS varchar(max) 
DECLARE @sql AS varchar(max) 
DECLARE @column_list AS varchar(max) 
SELECT @column_list = COALESCE(@column_list + ', ', '') 
     + QUOTENAME([Description]) 
FROM xRef 

SET @template = '; 
WITH up 
      AS (
       SELECT MachID 
         ,TestDate 
         ,MachType 
         ,[COLUMN] 
         ,[Value] 
       FROM  datadump UNPIVOT ([Value] FOR [Column] IN ([Value1], [Value2])) AS unpvt 
      ) 
      ,ready AS (
    SELECT machID 
      ,TestDate 
      ,up.MachType 
      ,[Description] 
      ,up.[Value] 
    FROM up 
    INNER JOIN xRef 
      ON xRef.machType = up.MachType 
       AND xRef.[Column] = up.[Column] 
) 
SELECT * FROM ready 
PIVOT (SUM([Value]) FOR [Description] IN ({@column_list})) AS pvt 
' 

machID TestDate    MachType Users Connected       % CPU _total       Number of Ports       packets/ms 
------ ----------------------- -------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- 
00001 2009-01-01 00:00:00.000 Server 15.000000000000000      48.000000000000000      NULL         NULL 
00001 2009-01-02 00:00:00.000 Server 16.000000000000000      99.000000000000000      NULL         NULL 
19999 2009-01-01 00:00:00.000 Switch NULL         NULL         32.000000000000000      4.988000000000000 
19999 2009-01-02 00:00:00.000 Switch NULL         NULL         32.000000000000000      5.810900000000000 
1

Динамический вариант SQL будет (выписана как запрос, а не из в процедурный):

declare @machtype varchar(40) --stored proc parameter? 
set @machtype = 'Switch' --or 'Server' 

declare @sql nvarchar(4000) 

set @sql = 'select 
    MachID, 
    TestDate, 
    MachType, 
    Value1 as ''' + (select [Description] from dbo.xref where machtype = @machtype and [Column] = 'Value1') + ''', 
    Value2 as ''' + (select [Description] from dbo.xref where machtype = @machtype and [Column] = 'Value2') + ''', 
    Value3 as ''' + (select [Description] from dbo.xref where machtype = @machtype and [Column] = 'Value3') + ''' 
from 
    dbo.datadump 
where 
    machtype = ''' + @machtype + '''' 

exec sp_executesql @sql 

Если вы обнаружите, что просто слишком уродлив для вас, то оборачивать логику для получения имя столбца в функции будет привести в порядок его:

create function dbo.ColNameForDataDump(
    @machtype varchar(40), 
    @column varchar(40) 
) 
RETURNS varchar(40) 
as 
begin 

    declare @col_desc varchar(40) 
    select 
     @col_desc = [description] 
    from 
     dbo.xref 
    where 
     machtype = @machtype 
     and [column] = @column 

    return @col_desc 
end 

Тогда ваш динамический SQL будет выглядеть как:

declare @machtype varchar(40) --stored proc parameter? 
set @machtype = 'Switch' --or 'Server' 

declare @sql nvarchar(4000) 

set @sql = 'select 
    MachID, 
    TestDate, 
    MachType, 
    Value1 as ''' + dbo.ColNameForDataDump(@machtype, 'Value1') + ''', 
    Value2 as ''' + dbo.ColNameForDataDump(@machtype, 'Value2') + ''', 
    Value3 as ''' + dbo.ColNameForDataDump(@machtype, 'Value3') + ''' 
from 
    dbo.datadump 
where 
    machtype = ''' + @machtype + '''' 

exec sp_executesql @sql 

В заключение прокомментируйте приведенный выше код: вы упомянули, что находитесь на SQL Server 2000, поэтому убедитесь, что когда вам нужно написать динамический sql, чтобы определить его как nvarchar и использовать sp_executesql для его вызова. , тем самым отрицая некоторую сильную боль, связанную с динамикой.

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