SQL从表中选择XML,例如序列化的Dictionary <string,object)

时间:2018-12-06 23:47:24

标签: sql xml dictionary serialization

=“”

我有一个XML结构,该结构是通过在C#中序列化Dictionary而获得的。我这样做是为了向一个表中添加一个AdditionalSettings列,而不是多个其他列,这很好用。

XML结构如下:

<Settings xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Setting>
    <Name>Setting1</Name>
    <Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:boolean">true</Value>
</Setting>
<Setting>
    <Name>Setting2</Name>
    <Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:boolean">true</Value>
</Setting>

该表具有以下几列:

ID (INT)
Setting1 (BIT)
Setting2 (BIT)

我认为我已经接近解决方案。这是我拥有的SQL。问题是我没有在Value元素上获得名称空间。

WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema-instance' AS i)
SELECT TOP 1 'Setting1' AS [Setting/Name], 
CASE Setting1 WHEN 1 THEN 'true' ELSE 'false' END AS [Setting/Value]
FROM MyTable
FOR XML PATH('Settings')

此SQL的输出如下所示:

<Settings xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Setting>
<Name>Setting1</Name>
<Value>true</Value>
</Setting>
</Settings>

编辑:我没有为假表做SQL,而是为临时表创建了SQL,以显示我要执行的操作。

DECLARE @TestTable TABLE (ID INT IDENTITY(1, 1) PRIMARY KEY, [Name] VARCHAR(10), Setting1 BIT, Setting2 BIT)
INSERT INTO @TestTable (Name, Setting1, Setting2)
VALUES
('Test1', 0, 0),
('Test2', 0, 1),
('Test3', 1, 0),
('Test4', 1, 1);

WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema-instance' AS i)
SELECT TOP 1 'Setting1' AS [Setting/Name], 
CASE Setting1 WHEN 1 THEN 'true' ELSE 'false' END AS [Setting/Value]
FROM @TestTable
WHERE Setting1 = 1
FOR XML PATH('Settings')

2 个答案:

答案 0 :(得分:0)

尝试更改:

AS [Setting/Value]

成为:

AS 'i:value'

例如

WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema-instance' AS i)
SELECT TOP 1 'Setting1' AS 'i:name',
CASE Setting1 WHEN 1 THEN 'true' ELSE 'false' END AS 'i:value'
FROM MyTable
FOR XML PATH('Settings')

答案 1 :(得分:0)

我终于放弃了尝试找到一种使用SQL查询执行此操作的方法,尽管如果有人确实知道了这一点,我仍然很想知道答案。

我最终要做的是编写一个C#Windows Forms应用程序(因为我想使用按钮而不是更常见的控制台应用程序来启动我想要的代码)。

如果有人感兴趣,此代码如下。

这是AdditionalSettings类。

SELECT
    IIF(ISNULL(T1.[group]), T2.[group], T1.[group]) AS [group],
    IIF(ISNULL(T1.[PU]), T2.[PU], T1.[PU]) AS [PU],
    IIF(ISNULL(T1.[currency]), T2.[currency], T1.[currency]) AS [currency],
    IIF(ISNULL(T2.[8345]), 0, T2.[8345]) - IIF(ISNULL(T1.[8345]), 0, T1.[8345]) AS [8345],
    IIF(ISNULL(T2.[6789]), 0, T2.[6789]) - IIF(ISNULL(T1.[6789]), 0, T1.[6789]) AS [6789],
    IIF(ISNULL(T2.[4589]), 0, T2.[4589]) - IIF(ISNULL(T1.[4589]), 0, T1.[4589]) AS [4589]
    FROM Table1 T1
    FULL OUTER JOIN TABLE2 T2
    ON T1.[group] = T2.[group]
    AND T1.[PU] = T2.[PU]
    AND T1.[currency] = T2.[currency]

代码如下:

[System.Runtime.Serialization.CollectionDataContract(Namespace = "", Name = "Settings", ItemName = "Setting", KeyName = "Name", ValueName = "Value")]
public class AdditionalSettings : Dictionary<string, object>
{
}