sql-server - 在表单元格中存储 id 列表 - SQL Server

标签 sql-server

我想在 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# 的默认值)进入 XMLNVARCHAR(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/

相关文章:

sql - 高效的 Ad-hoc SQL OLAP 结构

sql - 从多个字段中选择最大/最小值

sql-server - 如何为维度仓库中的日期设计收缩维度表并在SSAS中使用?

sql-server - 无法修改 SQL Server 维护计划

sql - 在 T-SQL 中查找最大时间重叠

sql-server - SSIS 将时间戳列派生为日期和时间列

sql-server - 服务堆栈 OrmLite 和 Identity_Insert

python - 使用python将数据插入MSSQL服务器

sql-server - "timestamp"真的被弃用了吗?

sql - 将主键添加到数据库中的一些现有表