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

时间:2017-04-13 09:56:51

标签: sql-server

我想在SQL服务器表格单元格中存储ID(字符串)列表。我在查询另一个SQL服务器表时遇到的这些ID列表 这些id列表稍后将反序列化为C#List <string>对象。

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

更新: SQL Server 2016支持OPENJSON,但我们的是SQL Server 2012.所以OPENJSON现在已经不可能了。

任何其他方法也可以,只要它将列表存储在单个单元格中,并且可以在以后直接反序列化为C#List <string>对象。

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

2 个答案:

答案 0 :(得分:1)

您希望在一列中存储ID列表。从你提出的问题来看,你知道的事实是,每个人,对RDBMS有一点了解会给你建议将它存储在1:n相关的边桌中。

但你不想要这个......

您有多种选择:

  • 将ID存储为CSV字符串(3,4,17)并稍后使用某种字符串拆分
  • 将ID作为XML存储在XML类型列中(支持归结为SQL Server 2005),如<IDs><ID>3</ID><ID>4</ID><ID>17</ID></IDs>
  • 将您拥有的JSON作为字符串存储到NVARCHAR(MAX)列

(AFAIK没有计划像XML那样引入真正的 JSON类型.JSON将是存储和表示中的字符串......)

从SQL Server 2016开始有JSON支持。您的所有目标系统都是现代的吗?

更新从List<string>

创建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;

这样的结果是像这样的字符串

<IDs><ID>SomeID_1</ID><ID>SomeID_2</ID><ID>SomeID_3</ID></IDs>

您可以将unicode string(C#的默认值)传递给SQL Server到SQL Server端的XMLNVARCHAR(MAX)。在那里你可以这样读:

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)

更新2

这将以与表格数据相同的格式创建XML 如果您仍然需要帮助,请开始一个新问题!!

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

答案 1 :(得分:0)

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

SELECT Id
FROM TableName
FOR XML AUTO  

https://docs.microsoft.com/en-us/sql/relational-databases/xml/use-auto-mode-with-for-xml

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

SELECT r.value('@id','int')
FROM TargetTable
CROSS APPLY IdsColumn.nodes('/Root/Id') AS x(r)

它应该适用于SQL Server 2008 +