我想在 SQL Server 表单元格中存储 id(字符串)列表。这些 id 列表是我在另一个 SQL Server 表上查询时获得的。
这些 id 列表稍后将反序列化为 C# List <string>
目的。
我注意到 SQL Server 有一些 OPENJSON表值函数可以创建 JSON(在我的例子中是一个 JSON 数组),但我不知道如何将其用于我的目的。
更新: SQL Server 2016 支持 OPENJSON,但我们的是 SQL Server 2012。所以 OPENJSON 现在已经不可能了。
任何其他方法也可以,只要它将列表存储在单个单元格中,并且稍后可以直接反序列化为 C# List <string>
目的。
注意:我不想使用单独的表来存储 id。这仅用于迁移数据。
最佳答案
您希望将 ID 列表存储在一个列中。从你的问题来看,我认为你知道这样一个事实,即每个人,对 RDBMS 有一点了解,都会建议你将其存储在 1:n
中。 -相关边 table 。
但你不想要这个......
您有多种选择:
- 将 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) 列中
(据我所知,没有计划引入像 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>
您可以将其传递给 SQL Server 作为 unicode string
(C# 的默认值)进入 XML
或NVARCHAR(MAX)
在 SQL Server 端。您可以像这样阅读它:
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
关于sql-server - 在表单元格中存储 id 列表 - SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43389097/