[英]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.