我想在SQL服务器表格单元格中存储ID(字符串)列表。我在查询另一个SQL服务器表时遇到的这些ID列表
这些id列表稍后将反序列化为C#List <string>
对象。
我注意到SQL服务器有一些OPENJSON表值函数可以创建JSON(在我的例子中是一个JSON数组),但我不知道如何将它用于我的目的。
更新: SQL Server 2016支持OPENJSON,但我们的是SQL Server 2012.所以OPENJSON现在已经不可能了。
任何其他方法也可以,只要它将列表存储在单个单元格中,并且可以在以后直接反序列化为C#List <string>
对象。
注意:我不想使用单独的表来存储ID。这仅用于迁移数据。
答案 0 :(得分:1)
您希望在一列中存储ID列表。从你提出的问题来看,你知道的事实是,每个人,对RDBMS有一点了解会给你建议将它存储在1:n
相关的边桌中。
但你不想要这个......
您有多种选择:
3,4,17
)并稍后使用某种字符串拆分<IDs><ID>3</ID><ID>4</ID><ID>17</ID></IDs>
(AFAIK没有计划像XML
那样引入真正的 JSON类型.JSON将是存储和表示中的字符串......)
从SQL Server 2016开始有JSON支持。您的所有目标系统都是现代的吗?
List<string>
有很多方法,这是其中之一:
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端的XML
或NVARCHAR(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)
这将以与表格数据相同的格式创建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 +