2009-02-05 5 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 

트릭은 "값"열 기계의 다른 유형에 대한 다른 의미이다. 그래서 우리는 "외부 참조"과 같은 테이블이 : 내가 아는

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

해당 개별 유형의 쿼리에 대한 각 값의 헤더 이름을 저장하는 테이블을 만듭니다.

그런 다음 저장 프로 시저를 만들고 동적 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을 사용하여 호출해야합니다. 따라서 동적 인 작업 수행에 따른 성능상의 고통을 무효화합니다.

관련 문제