XML列在SQL Server中进行比较

时间:2015-07-14 05:04:49

标签: sql sql-server xml

我有3列:

  1. [OldContent] [xml] NULL
  2. [NewContent] [xml] NULL
  3. [OldContent] [xml] NULL
  4. 我想比较两列中的数据。我想将结果写入第三列([OldContent]

    如何在SQL Server中执行此操作?

    [OldContent] [xml] NULL,在

    价值

    <row GUEST_ID="13" GUEST_NAME="VEDAT" GUEST_SURNAME="PALA" ADRESS="IZMIR" />
    

    [NewContent] [xml] NULL,值

    <row GUEST_ID="13" GUEST_NAME="VEDAT35" GUEST_SURNAME="PALA" ADRESS="IZMIR" CITY="DR" CITY_CODE="35" />
    

    我想在其中写入值。

    [UpdateContent] [xml] NULL
    
    <row GUEST_NAME="VEDAT35 CITY="DR" CITY_CODE="35" />
    

    我需要一个比较XML列值的过程。

    http://i57.tinypic.com/2pqky80.jpg

    http://i60.tinypic.com/2cpc615.jpg

2 个答案:

答案 0 :(得分:0)

从XML中获取数据非常容易。然后你可以比较你的数据和#34;以及#34;。您可以使用&#34; FOR XML&#34;。

将结果写入新的XML

试试这样:

DECLARE @myXML XML=
'<rows>
 <row GUEST_ID="13" GUEST_NAME="VEDAT35" GUEST_SURNAME="PALA" ADRESS="IZMIR" CITY="DR" CITY_CODE="35" />
 <row GUEST_ID="14" GUEST_NAME="TestGuestName" GUEST_SURNAME="TestSurname" ADRESS="TestAddr" CITY="TestCity" CITY_CODE="11" />
 </rows>';

--This is how you retrieve the data 
SELECT x.y.value('@GUEST_ID','int')
      ,x.y.value('@GUEST_NAME','varchar(max)')
      ,x.y.value('@GUEST_SURNAME','varchar(max)')
      ,x.y.value('@ADRESS','varchar(max)')
      ,x.y.value('@CITY','varchar(max)')
      ,x.y.value('@CITY_CODE','int')
FROM @myXML.nodes('/rows/row') AS x(y)

--This is how you create a new XML with your data
SELECT 13 AS [@GUEST_ID]
      ,'NewName' AS [@GUEST_NAME]
      ,'NewSurname' AS [@GUEST_SURNAME]      
      ,'NewAddr' AS [@GUEST_ADRESS]      
      ,'NewCity' AS [@CITY]
      ,12 AS [@CITY_CODE]
FOR XML PATH('row'),ROOT('rows') 

答案 1 :(得分:0)

样本表

USE [DENEME]
GO

/****** Object:  Table [dbo].[GUESTS]    Script Date: 17.07.2015 22:19:35         ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[GUESTS](
[GUEST_ID] [int] IDENTITY(1,1) NOT NULL,
[GUEST_NAME] [varchar](50) NULL,
[GUEST_SURNAME] [varchar](50) NULL,
[ADRESS] [varchar](100) NULL,
[CITY] [varchar](50) NULL,
[CITY_CODE] [varchar](10) NULL,
[COUNTRY] [varchar](50) NULL,
[STATUS] [varchar](20) NULL,
[COMMENT] [nvarchar](max) NULL,
PRIMARY KEY CLUSTERED 
(
[GUEST_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,         ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO


USE [DENEME]
GO
/****** Object:  Trigger [dbo].[iudt_AutoAuditChanges]    Script Date:     17.07.2015 22:20:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[iudt_AutoAuditChanges] 
ON  [dbo].[GUESTS]
AFTER INSERT,DELETE,UPDATE
AS 
BEGIN
SET NOCOUNT ON;
declare @AuditType char(1) /* BEN EKELEDM*/
Declare @v_AuditID bigint

/******************************/
if exists (select * from inserted) 
if exists (select * from deleted) 
SET @AuditType = 'U' 
else 
SET @AuditType = 'I' 
else 
SET @AuditType = 'D'
/******************************/

IF OBJECT_ID('dbo.AutoAudit','U') IS NULL BEGIN
    CREATE TABLE [dbo].[AutoAudit]
    (   [AuditID] bigint identity,
        [AuditType] Char(1), 
        [AuditDate] DateTime,
        [AuditUserName] varchar(128),
        [TableName] varchar(128) NULL,
        [OldContent] XML NULL,
        [NewContent] XML NULL,
        [Updatedcontent] XML NULL
    )

    ALTER TABLE dbo.AutoAudit ADD CONSTRAINT
    PK_AutoAudit PRIMARY KEY CLUSTERED 
    (
        [AuditID]
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

    CREATE NONCLUSTERED INDEX [idx_AutoAudit_TableName_AuditDate] ON [dbo].    [AutoAudit] 
      (   [TableName] ASC,
        [AuditDate] ASC
    )WITH (STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF,     IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON,     ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    END

Select * Into #AuditDeleted from deleted
Select * Into #AuditInserted from inserted

While (Select COUNT(*) from #AuditDeleted) > 0 OR (Select COUNT(*) from     #AuditInserted) > 0
Begin

    INSERT INTO [dbo].[AutoAudit]
        ( [AuditDate],[AuditType], [AuditUserName], [TableName],     [OldContent], [NewContent])
    SELECT 
        GETDATE(),
        @AuditType,
        SUSER_NAME(),
        [TableName]=object_name([parent_obj]),
        [OldContent]=CAST((SELECT TOP 1 * FROM #AuditDeleted D FOR XML RAW)     AS xml),
        [NewContent]=CAST((SELECT TOP 1 * FROM #AuditInserted I FOR XML RAW)     AS xml)
    FROM sysobjects 
    WHERE
        [xtype] = 'tr' 
        and [name] = OBJECT_NAME(@@PROCID)

    Set @v_AuditID = SCOPE_IDENTITY()

    Delete from AutoAudit
    Where AuditID = @v_AuditID
        AND Convert(varchar(max),oldContent) =     Convert(varchar(max),NewContent)

    Delete top(1) from #AuditDeleted
    Delete top(1) from #AuditInserted

    End
END

我正在写日志程序。 OldContent:

<row GUEST_ID="19" GUEST_NAME="VEDAT" GUEST_SURNAME="PALA" ADRESS="TURKEY" CITY="TOKAT" CITY_CODE="60" />

newcontent:

<row GUEST_ID="19" GUEST_NAME="VEDAT60" GUEST_SURNAME="PALA" ADRESS="TURKEY"     CITY="TOKAT" CITY_CODE="60" STATUS="other" COMMENT="uptaded  fields" />

预期结果: UptadedContent:

<row GUEST_NAME="VEDAT60" STATUS="other" COMMENT="uptaded  fields" />

我想要比较程序.. 看这张照片 IMG] http://i59.tinypic.com/24nfibl.png[/IMG]