繁体   English   中英

从其他表中检索列名?

[英]Retrieve column names from a different table?

我有一个“数据转储”表,其中包含许多与性能相关的混合数据。 就像是:

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

有没有一种方法可以不对每种类型进行单独的硬编码查询呢?

注意 :我只需要一次查询一种类型的对象。 如果有帮助,我很可能只查看单个MachID在特定日期之间的所有结果。 这是MS SQL 2000。

谢谢!

这将一起完成所有操作-如果希望将它们全部拆分,则可以进行适当的修改。

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

动态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进行调用...从而否定一些不得不动态变化的性能痛苦。

创建一个表,为该单独类型的查询存储每个值的标题名称。

然后,创建一个存储过程,并使用Dynamic SQL填写从该表绘制的列名。

由于您无法更改数据模型,因此建议您将演示代码放入应用程序的演示层。 拥有一张表格,该表格根据要求的结果为您提供要使用的列标题,然后从那里开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM