Sql server 在表格单元格中存储ID列表-SQL Server

Sql server 在表格单元格中存储ID列表-SQL Server,sql-server,Sql Server,我想将ID(字符串)列表存储在SQL server表单元格中。这些是我在查询另一个SQL server表时获取的ID列表。 这些ID列表稍后将反序列化为C#list对象 我注意到SQL server有一些表值函数,可以创建JSON(在我的例子中是JSON数组),但我不知道如何将其用于我的目的 更新:SQL server 2016支持OPENJSON,但我们的版本是SQL server 2012。所以OPENJSON现在是不可能的 任何其他方法也可以,只要它将列表存储在单个单元格中,然后可以直接反

我想将ID(字符串)列表存储在SQL server表单元格中。这些是我在查询另一个SQL server表时获取的ID列表。
这些ID列表稍后将反序列化为C#
list
对象

我注意到SQL server有一些表值函数,可以创建JSON(在我的例子中是JSON数组),但我不知道如何将其用于我的目的

更新:SQL server 2016支持OPENJSON,但我们的版本是SQL server 2012。所以OPENJSON现在是不可能的

任何其他方法也可以,只要它将列表存储在单个单元格中,然后可以直接反序列化到C#
list
对象



注意:我不想使用单独的表来存储ID。这仅用于迁移数据。

您希望在一列中存储ID列表。我从你的问题中了解到,你知道这样一个事实:每个人都知道一点关于RDBMS的知识,这会给你一个建议,将其存储在与
1:n
相关的副表中

但是你不想要这个

您有几个选择:

  • 将ID存储为CSV字符串(
    3,4,17
    ),然后使用某种字符串拆分
  • 将ID作为XML存储在XML类型的列中(支持SQL Server 2005),如
    3417
  • 将JSON与字符串一样存储到NVARCHAR(MAX)列中
(恐怕没有计划像
XML
那样引入真正的JSON类型。JSON将是存储和表示中的字符串…)

从SQL Server 2016开始提供JSON支持。你所有的目标系统都那么现代吗

列表中更新创建XML
有很多方法,这是其中之一:

var ListOfIds = new List<string>();
ListOfIds.Add("SomeID_1");
ListOfIds.Add("SomeID_2");
ListOfIds.Add("SomeID_3");

var xdoc = new XmlDocument();
var ids=xdoc.CreateNode(XmlNodeType.Element, "IDs", null);
foreach (string s in ListOfIds) {
    var id = ids.AppendChild(xdoc.CreateNode(XmlNodeType.Element, "ID", null));
    id.InnerText = s;
}
xdoc.AppendChild(ids);
var result = xdoc.InnerXml;
更新2 这将以与上述表外数据相同的格式创建XML。
如果您仍然需要帮助,请开始一个新问题

SELECT SomeID AS [*] FROM SomeWhere FOR XML PATH('ID'),ROOT('IDs'),TYPE

通过检索数据,您可以使用“For XML”将ID存储为XML,在您的情况下,可能类似于:

SELECT Id
FROM TableName
FOR XML AUTO  

您可以使用nodes()函数检索XML数据,如下所示:

DECLARE @xml XML=N'<IDs><ID>SomeID_1</ID><ID>SomeID_2</ID><ID>SomeID_3</ID></IDs>';
SELECT id.value(N'(./text())[1]','nvarchar(max)') AS ID
FROM @xml.nodes(N'/IDs/ID') AS One(id)
SELECT r.value('@id','int')
FROM TargetTable
CROSS APPLY IdsColumn.nodes('/Root/Id') AS x(r)

它应该与SQL Server 2008+配合使用。

我刚刚发现我们的版本是2012:p。你说得对。。可能应该使用XML。您还可以提供创建表查询和向xml列插入查询。我以前从未使用过xml类型。嗨@Jerry,请避免使用变色龙问题。。。StackOverflow不仅是一个获取帮助的网站,而且是一个巨大的已回答问题的存档。因此,原则是:一个问题一个问题。最初的问题是如何在一个单元格中存储ID列表,这似乎已经解决了。如果是,请向上投票并通过单击投票计数器下方的复选框接受我的答案,以关闭此问题并将其标记为已解决。而不是为新问题开始一个新问题,提供更多细节和示例数据。很抱歉,您采用了其他方式,但我的问题仍然是一样的(将列表存储在单元格中)。我是说我从来没有在sql server中使用过xml,所以我希望你能更详细一点(可能有一个例子)@Jerry,请看我的更新,但是:没有!我没有采取另一种方式!你的问题有一个标题,这就是人们正在寻找的。。。这个问题不是如何将C#
列表
存储在一个表列中。然而。。。快乐编码!感谢您提供了一个很好的示例,但我的要求是存储使用INSERT INTO query从另一个sql表获得的ID列表。我想将这些ID列表存储在一个单元格中。稍后我想将这些ID反序列化为列表。我在问题中也提到了同样的问题。请提供具体的细节/代码而不是链接,如果这些链接在将来过期,你的答案将不再有效。欢迎。希望能有帮助。但我也希望微软文档不会在最近的将来过期;)。
SELECT r.value('@id','int')
FROM TargetTable
CROSS APPLY IdsColumn.nodes('/Root/Id') AS x(r)