SQL Server SQL服务器:显示每个数据集的列

cuxqih21  于 2023-02-11  发布在  其他
关注(0)|答案(4)|浏览(128)

我正在将数据导出到平面文件中,以便导入到SIEM中。有没有办法将每个项目显示为“column name = data”?

SELECT 
    [Description], [MessageDescription], [CardNumber], 
    [TimeStamp_Server], [SPMDescription] [CardHolderID], 
    [FirstName], [MiddleName], [LastName],
    [CardStatusID], [CardStatusDescription], [Imprint],
    [TransactionNumber]
FROM 
    [DB].[dbo].[Message]
WHERE 
    CONVERT(varchar(10), TimeStamp_Server, 120) = CONVERT(varchar(10), GETDATE(), 120)

下面是它当前在平面文件中的显示方式。

Description,MessageDescription,CardNumber,TimeStamp_Server,CardHolderID,FirstName,MiddleName,LastName,CardStatusID,CardStatusDescription,Imprint,TransactionNumber
North Entry,AccessGrantedNoEntry,0,2023-02-08 09:52:19,Retail Center C004 Converted PXL250-2DOOR,,,,,,,527312

我希望每行都显示为

Description = North Entry,
MessageDescription = AccessGrantedNoEntry,
CardNumber = 0, 
TimeStamp_Server = 2023-02-08

...等等。

zdwk9cvp

zdwk9cvp1#

这是一个次要问题(社区wiki也是如此),但是您可以通过如下修改WHERE子句(假设TimeStamp_ServerDateTime列)* a显著**提高此查询的性能:

WHERE TimeStamp_Server >= cast(cast(getdate() as date) as datetime) 
    AND TimeStamp_Server < cast(dateadd(day, 1, cast(getdate() as date)) as datetime)

这在三个方面有所帮助:
1.由于文化/国际化问题,将日期转换为字符串值比我们想象的要慢得多,而且更容易出错。坚持使用Date函数和类型总是会执行得更好,更准确。
1.通过将所有的修改都转移到getdate()TimeStamp_Server就不会被改变,我们就不需要对表中的每一行**进行转换。
1.通过将所有修改转移到getdate()TimeStamp_Server就不会被修改,我们保留了对该列可能存在的任何索引的使用,这就触及了数据库性能的核心。

sirbozc5

sirbozc52#

使用一点JSON和string_agg()

Select B.NewVal
From ( 
       --Your Query Here-- 
     ) A
 Cross Apply (
                Select NewVal = string_agg(concat([key],' = ',value),',')
                 From openjson( (Select A.* For JSON Path,Without_Array_Wrapper  ) )
              ) B
c9qzyr3d

c9qzyr3d3#

一个最小的可复制的例子没有提供。所以,我是从臀部拍摄。
请尝试以下概念示例。
恕我直言,JSON或XML输出格式要可靠得多。

    • SQL语言**
-- DDL and sample data population, start
DECLARE @tbl TABLE (id INT PRIMARY KEY, case_date DATE, Product INT);
INSERT INTO @tbl (id, case_date, Product) VALUES
(55, '2022-08-01', 11),
(66, '2022-05-21', 51);
-- DDL and sample data population, end

SELECT t.*
    , result = STUFF(XMLData.query('
        for $x in /root/*
        return concat(", ", local-name($x), "=", $x/text()[1])
        ').value('.', 'VARCHAR(4096)'), 1,2,'')
FROM @tbl AS t
CROSS APPLY (SELECT t.* FOR XML PATH(''), TYPE, ROOT('root')) AS t1(XMLData);
    • 产出**

| 身份证|病例_日期|产品|结果|
| - ------|- ------|- ------|- ------|
| 五十五|2022年8月1日|十一|id = 55,病例日期= 2022年8月1日,产品= 11|
| 六十六|二〇二二年五月二十一日|五十一|id = 66,病例日期= 2022年5月21日,产品= 51|

lawou6xi

lawou6xi4#

感谢你@Stu提供我在评论中寻求的东西:
所以你想在每一行上复制每一个列名吗?这将显著增加文件的大小!

select concat('columnName = ', ColumnName)Columename, ...

相关问题