簡體   English   中英

T-SQL字符串轉換

[英]T-SQL string conversion

我在SQL表中有一個SNMP消息列(格式為VARCHAR(MAX)),如下所示。 有沒有一種方法可以將每個消息OID轉換為列/值格式?

消息列內容示例:

community=PUBLIC, enterprise=1.1.1.1.1.1.1.1.1.1.1, uptime=42170345, agent_ip=1.1.1.1, version=Ver2, ...

所需結果:

community    enterprise              uptime    agent_ip
---------    ----------              ------    --------
PUBLIC       1.1.1.1.1.1.1.1.1.1.1   42170345  1.1.1.1    ...

因此,基本上它需要將字符串用“,”分割,然后將INI值作為列返回。 請注意,這是在一行上(不是創建或拆分為多行,而是多列)

這是SQL Server 2008 R2。

謝謝。

您可以在網上許多地方找到splitstring函數。 這是在查詢中使用它來執行所需操作的方式:

select t.*, cols.*
from table t cross apply
     (select max(case when token like 'community=%' then substring(token, 11, len(token))
                 end) as community,
             max(case when token like 'enterprise=%' then substring(token, 12, len(token))
                 end) as enterprise,
             max(case when token like 'uptime=%' then substring(token, 8, len(token))
                 end) as uptime,
             max(case when token like 'agent_ip=%' then substring(token, 10, len(token))
                 end) as agent_ip
      from dbo.SplitString(t.snmp, ',')(idx, token)
     ) cols;

可能不是執行此操作的最有效方法,但這可行:

SELECT
  REPLACE((SUBSTRING(MsgText,CHARINDEX('community=',MsgText),CHARINDEX(', enterprise=',MsgText) - CHARINDEX('community=',MsgText))),'community=','') AS community  
  ,REPLACE((SUBSTRING(MsgText,CHARINDEX('enterprise=',MsgText),CHARINDEX(', uptime=',MsgText) - CHARINDEX('enterprise=',MsgText))),'enterprise=','') AS enterprise
  ,REPLACE((SUBSTRING(MsgText,CHARINDEX('uptime=',MsgText),CHARINDEX(', agent_ip=',MsgText) - CHARINDEX('uptime=',MsgText))),'uptime=','') AS uptime
  ,REPLACE((SUBSTRING(MsgText,CHARINDEX('agent_ip=',MsgText),CHARINDEX(', version=',MsgText) - CHARINDEX('agent_ip=',MsgText))),'agent_ip=','') AS agent_ip
  ,MsgText
FROM Database.dbo.Table

萬一有人需要解析SNMP消息的方法

這是使用將字符串轉換為XML的解決方案,它為結果處理帶來了更多的自由:

-- Prepare data for solution testing
DECLARE @srctable TABLE (
    Id              INT,
    SnmpMessage     VARCHAR(MAX),
    SnmpMessageXml  XML
)

INSERT INTO @srctable
SELECT Id, SnmpMessage, SnmpMessageXml FROM ( VALUES
(1, 'community=PUBLIC, enterprise=1.1.1.1.1.1.1.1.1.1.1, uptime=42170345, agent_ip=1.1.1.1, version=Ver2',   null)
) v (Id, SnmpMessage, SnmpMessageXml)

-- Transform source formatted string to XML string
UPDATE @srctable
SET SnmpMessageXml = CAST('<row><data ' + REPLACE(REPLACE(SnmpMessage, ',', '"/><data '), '=', '="') + '"/></row>' AS XML)

-- Final select from XML data
SELECT  SnmpMessageXml.value('(/row/data/@community)[1]',  'VARCHAR(999)') AS community,
        SnmpMessageXml.value('(/row/data/@enterprise)[1]',  'VARCHAR(999)') AS enterprise,
        SnmpMessageXml.value('(/row/data/@uptime)[1]',  'VARCHAR(999)') AS uptime,
        SnmpMessageXml.value('(/row/data/@agent_ip)[1]',  'VARCHAR(999)') AS agent_ip,
        SnmpMessageXml.value('(/row/data/@version)[1]',  'VARCHAR(999)') AS version
FROM @srctable AS t

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM