如何使用更新插入新的 xml 元素并替换为 SQL Server Management Studio
How to insert a new xml element with update and replace with SQL Server Manangement Studio
我有这个 XML:
<qrcode xmlns="http://vital.nl/qrcodeSchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Echeq>
<echeqFamilyId>67c8590e-66fe-43e1-9124-a2163a6365df</echeqFamilyId>
</Echeq>
</qrcode>
但我想得到这个:
<qrcode xmlns="http://vital.nl/qrcodeSchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Echeq>
<awardedVPoints>0</awardedVPoints>
<echeqFamilyId>67c8590e-66fe-43e1-9124-a2163a6365df</echeqFamilyId>
</Echeq>
</qrcode>
我试着得到这样的结果:
UPDATE[dbo].[QRCodeDefinitions]
SET[QRCodeXml] = CAST(REPLACE(CAST([QRCodeXml] as nvarchar(max)), '', '<awardedVPoints>0') AS xml)
FROM [dbo].[QRCodeDefinitions]
WHERE qrcode = 'newvcheq'
但是 xml.
中没有任何变化
那么我必须改变什么?
谢谢
好的,所以我尝试了这个:
;WITH XMLNAMESPACES(N'http://vital10.nl/qrcodeSchema.xsd' AS ns)
UPDATE [dbo].[QRCodeDefinitions]
SET QRCodeXml = QRCodeXml.query('
declare default element namespace "http://vital.nl/qrcodeSchema.xsd";
<qrcode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
{
for $x in ns:/qrcode/*
return (
if (empty($x/../awardedVPoints)) then (<awardedVPoints> {"0"}</awardedVPoints>)
else (), $x)
}
</qrcode>')
FROM [dbo].[QRCodeDefinitions]
WHERE qrcode = 'newvcheq'
但后来我明白了:
Msg 9332, Level 16, State 1, Line 38
XQuery [dbo.QRCodeDefinitions.QRCodeXml.query()]: Syntax error near ':', expected 'where', '(stable) order by' or 'return'.
如果我这样做:
UPDATE [dbo].[QRCodeDefinitions]
SET [QRCodeXml] = [QRCodeXml].query('
declare default element namespace "http://vital.nl/qrcodeSchema.xsd";
<qrcode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
{
for $x in /qrcode/*
return (
if (empty($x/../awardedVPoints)) then (<awardedVPoints> {"0"}</awardedVPoints>)
else (), $x)
}
</qrcode>')
FROM [dbo].[QRCodeDefinitions]
WHERE qrcode = 'newvcheq'
然后我得到这个错误:
XML Validation: Invalid content. Expected element(s): '{http://vital.nl/qrcodeSchema.xsd}ExternalUrl','{http://vital.nl/qrcodeSchema.xsd}Platform','{http://vital.nl/qrcodeSchema.xsd}Image','{http://vital10.nl/qrcodeSchema.xsd}Location','{http://vital.nl/qrcodeSchema.xsd}Echeq','{http://vital.nl/qrcodeSchema.xsd}Video'. Found: element '{http://vital10.nl/qrcodeSchema.xsd}awardedVPoints' instead. Location: /:qrcode[1]/:awardedVPoints[1].
那么我必须改变什么?谢谢
Table设计。所以这就是table的细节了。所有 table 字段
CREATE TABLE [dbo].[QRCodeDefinitions]
(
[QRCode] [nvarchar](256) NOT NULL,
[Title] [nvarchar](256) NOT NULL,
[Description] [nvarchar](max) NOT NULL,
[CreatedBy] [uniqueidentifier] NOT NULL,
[CreatedOn] [datetime2](7) NOT NULL,
[UpdatedOn] [datetime2](7) NOT NULL,
[ValidUntil] [datetime2](7) NOT NULL,
[LastScannedOn] [datetime2](7) NULL,
[TotalScanned] [bigint] NOT NULL,
[MaxAllowedToScan] [bigint] NULL,
[MaxAllowedToScanByParticipant] [bigint] NULL,
[ScanFrequency] [bigint] NULL,
[ScanFrequencyType] [int] NOT NULL,
[ActionType] [int] NOT NULL,
[QRCodeXml] [xml](CONTENT [dbo].[QRCodeSchema-2019-07-23]) NULL,
[PublishState] [int] NOT NULL,
CONSTRAINT [PK_QRCodeDefinitions] PRIMARY KEY CLUSTERED
(
[QRCode] 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
ALTER TABLE [dbo].[QRCodeDefinitions] ADD DEFAULT ((0)) FOR [PublishState]
GO
所以这必须是正确答案:
UPDATE [dbo].[QRCodeDefinitions]
SET QRCodeXml = QRCodeXml.query('
declare default element namespace "http://vital10.nl/qrcodeSchema.xsd";
<qrcode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
{
for $x in /qrcode/*
return (
if (empty($x/../awardedVPoints)) then (<awardedVPoints>{"0"}</awardedVPoints>)
else (), $x)
}
</qrcode>')
FROM[dbo].[QRCodeDefinitions]
WHERE qrcode = 'newvcheq';
请尝试以下解决方案。
它使用 XQuery 及其 FLWOR 表达式。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, QRCodeXml XML, qrcode NVARCHAR(256));
INSERT INTO @tbl (QRCodeXml, qrcode) VALUES
(N'<?xml version="1.0"?>
<qrcode xmlns="http://vital.nl/qrcodeSchema.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Echeq>
<echeqFamilyId>67c8590e-66fe-43e1-9124-a2163a6365df</echeqFamilyId>
</Echeq>
</qrcode>', 'newvcheq');
-- DDL and sample data population, end
-- before
SELECT * FROM @tbl;
UPDATE @tbl
SET QRCodeXml = QRCodeXml.query('
declare default element namespace "http://vital.nl/qrcodeSchema.xsd";
<qrcode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
{
for $x in /qrcode/Echeq
return <Echeq>
{
if (empty($x/awardedVPoints)) then
(element awardedVPoints {"0"}, $x/*)
else $x/*
}
</Echeq>
}
</qrcode>')
FROM @tbl
WHERE qrcode = 'newvcheq';
-- after
SELECT * FROM @tbl;
Output
<qrcode xmlns="http://vital.nl/qrcodeSchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Echeq>
<awardedVPoints>0</awardedVPoints>
<echeqFamilyId>67c8590e-66fe-43e1-9124-a2163a6365df</echeqFamilyId>
</Echeq>
</qrcode>
我有这个 XML:
<qrcode xmlns="http://vital.nl/qrcodeSchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Echeq>
<echeqFamilyId>67c8590e-66fe-43e1-9124-a2163a6365df</echeqFamilyId>
</Echeq>
</qrcode>
但我想得到这个:
<qrcode xmlns="http://vital.nl/qrcodeSchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Echeq>
<awardedVPoints>0</awardedVPoints>
<echeqFamilyId>67c8590e-66fe-43e1-9124-a2163a6365df</echeqFamilyId>
</Echeq>
</qrcode>
我试着得到这样的结果:
UPDATE[dbo].[QRCodeDefinitions]
SET[QRCodeXml] = CAST(REPLACE(CAST([QRCodeXml] as nvarchar(max)), '', '<awardedVPoints>0') AS xml)
FROM [dbo].[QRCodeDefinitions]
WHERE qrcode = 'newvcheq'
但是 xml.
中没有任何变化那么我必须改变什么?
谢谢
好的,所以我尝试了这个:
;WITH XMLNAMESPACES(N'http://vital10.nl/qrcodeSchema.xsd' AS ns)
UPDATE [dbo].[QRCodeDefinitions]
SET QRCodeXml = QRCodeXml.query('
declare default element namespace "http://vital.nl/qrcodeSchema.xsd";
<qrcode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
{
for $x in ns:/qrcode/*
return (
if (empty($x/../awardedVPoints)) then (<awardedVPoints> {"0"}</awardedVPoints>)
else (), $x)
}
</qrcode>')
FROM [dbo].[QRCodeDefinitions]
WHERE qrcode = 'newvcheq'
但后来我明白了:
Msg 9332, Level 16, State 1, Line 38
XQuery [dbo.QRCodeDefinitions.QRCodeXml.query()]: Syntax error near ':', expected 'where', '(stable) order by' or 'return'.
如果我这样做:
UPDATE [dbo].[QRCodeDefinitions]
SET [QRCodeXml] = [QRCodeXml].query('
declare default element namespace "http://vital.nl/qrcodeSchema.xsd";
<qrcode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
{
for $x in /qrcode/*
return (
if (empty($x/../awardedVPoints)) then (<awardedVPoints> {"0"}</awardedVPoints>)
else (), $x)
}
</qrcode>')
FROM [dbo].[QRCodeDefinitions]
WHERE qrcode = 'newvcheq'
然后我得到这个错误:
XML Validation: Invalid content. Expected element(s): '{http://vital.nl/qrcodeSchema.xsd}ExternalUrl','{http://vital.nl/qrcodeSchema.xsd}Platform','{http://vital.nl/qrcodeSchema.xsd}Image','{http://vital10.nl/qrcodeSchema.xsd}Location','{http://vital.nl/qrcodeSchema.xsd}Echeq','{http://vital.nl/qrcodeSchema.xsd}Video'. Found: element '{http://vital10.nl/qrcodeSchema.xsd}awardedVPoints' instead. Location: /:qrcode[1]/:awardedVPoints[1].
那么我必须改变什么?谢谢
Table设计。所以这就是table的细节了。所有 table 字段
CREATE TABLE [dbo].[QRCodeDefinitions]
(
[QRCode] [nvarchar](256) NOT NULL,
[Title] [nvarchar](256) NOT NULL,
[Description] [nvarchar](max) NOT NULL,
[CreatedBy] [uniqueidentifier] NOT NULL,
[CreatedOn] [datetime2](7) NOT NULL,
[UpdatedOn] [datetime2](7) NOT NULL,
[ValidUntil] [datetime2](7) NOT NULL,
[LastScannedOn] [datetime2](7) NULL,
[TotalScanned] [bigint] NOT NULL,
[MaxAllowedToScan] [bigint] NULL,
[MaxAllowedToScanByParticipant] [bigint] NULL,
[ScanFrequency] [bigint] NULL,
[ScanFrequencyType] [int] NOT NULL,
[ActionType] [int] NOT NULL,
[QRCodeXml] [xml](CONTENT [dbo].[QRCodeSchema-2019-07-23]) NULL,
[PublishState] [int] NOT NULL,
CONSTRAINT [PK_QRCodeDefinitions] PRIMARY KEY CLUSTERED
(
[QRCode] 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
ALTER TABLE [dbo].[QRCodeDefinitions] ADD DEFAULT ((0)) FOR [PublishState]
GO
所以这必须是正确答案:
UPDATE [dbo].[QRCodeDefinitions]
SET QRCodeXml = QRCodeXml.query('
declare default element namespace "http://vital10.nl/qrcodeSchema.xsd";
<qrcode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
{
for $x in /qrcode/*
return (
if (empty($x/../awardedVPoints)) then (<awardedVPoints>{"0"}</awardedVPoints>)
else (), $x)
}
</qrcode>')
FROM[dbo].[QRCodeDefinitions]
WHERE qrcode = 'newvcheq';
请尝试以下解决方案。 它使用 XQuery 及其 FLWOR 表达式。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, QRCodeXml XML, qrcode NVARCHAR(256));
INSERT INTO @tbl (QRCodeXml, qrcode) VALUES
(N'<?xml version="1.0"?>
<qrcode xmlns="http://vital.nl/qrcodeSchema.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Echeq>
<echeqFamilyId>67c8590e-66fe-43e1-9124-a2163a6365df</echeqFamilyId>
</Echeq>
</qrcode>', 'newvcheq');
-- DDL and sample data population, end
-- before
SELECT * FROM @tbl;
UPDATE @tbl
SET QRCodeXml = QRCodeXml.query('
declare default element namespace "http://vital.nl/qrcodeSchema.xsd";
<qrcode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
{
for $x in /qrcode/Echeq
return <Echeq>
{
if (empty($x/awardedVPoints)) then
(element awardedVPoints {"0"}, $x/*)
else $x/*
}
</Echeq>
}
</qrcode>')
FROM @tbl
WHERE qrcode = 'newvcheq';
-- after
SELECT * FROM @tbl;
Output
<qrcode xmlns="http://vital.nl/qrcodeSchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Echeq>
<awardedVPoints>0</awardedVPoints>
<echeqFamilyId>67c8590e-66fe-43e1-9124-a2163a6365df</echeqFamilyId>
</Echeq>
</qrcode>