0

パフォーマンス関連のデータが混在する「データダンプ」テーブルがあります。何かのようなもの:

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   

トリックは、「値」列が異なるタイプのマシンに対して異なることを意味することです。したがって、次のような「xRef」テーブルがあります。

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

タイプごとに個別のハードコーディングされたクエリを実行せずにこれを行う方法はありますか?

注: 一度に 1種類のオブジェクトを照会するだけで済みます。おそらく、単一の MachID の特定の日付間のすべての結果のみを調べます。これは MS SQL 2000 です。

ありがとう!

4

4 に答える 4

1

動的 sql オプションは次のようになります (proc にするのではなく、クエリとして書き出す)。

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 を使用してそれを呼び出す必要がある場合を確認してください。ダイナミックに行かなければならないというパフォーマンスの苦痛の。

于 2009-02-06T00:46:14.117 に答える
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
于 2009-02-05T22:29:14.613 に答える
0

データ モデルを変更することはできないため、プレゼンテーション コードをアプリケーションのプレゼンテーション レイヤーに配置することをお勧めします。要求された結果に基づいて使用する列見出しを示す表を用意し、そこから進みます。

于 2009-02-05T21:47:36.770 に答える
0

その個々のタイプのクエリの各値のヘッダー名を格納するテーブルを作成します。

次に、ストアド プロシージャを作成し、ダイナミック SQL を使用して、そのテーブルから取得した列名を入力します。

于 2009-02-05T21:29:19.490 に答える