【问题标题】:C# Dapper using JSON_VALUE for SQL Server 2016C# Dapper 为 SQL Server 2016 使用 JSON_VALUE
【发布时间】:2018-04-02 07:30:38
【问题描述】:

我想使用JSON_VALUE从我的表中查询数据:

var str = "123";
var value = "Name"
using(var conn = GetMyConnection())
{
   var result = conn.QueryFirstOrDefault<string>(
      @"SELECT [Id] FROM [dbo].[MyTable]
         WHERE JSON_VALUE([JsonColumn], @MyQuery) = @Str",
      new
      {
         MyQuery = $"$.{value}",
         Str = str
      }
   );
}

我在 SQL Server 中尝试了这个,它正在工作:

SELECT [Id] FROM [dbo].[MyTable]
WHERE JSON_VALUE([JsonColumn], '$.Name') = '123'

我应该如何调整我的代码?

【问题讨论】:

  • 我建议你创建一个存储过程并将你的json字符串作为参数并在那里处理。
  • 我在本地环境中尝试了此代码。它工作正常。代码有什么问题?
  • @sarslan 它不起作用,因为 OP 将其作为文字传递,而在 C# 中他试图将其作为变量传递。 SQL Server 中唯一的方法是使用动态 SQL 或在 C# 代码中构建查询字符串。
  • @lad2025 实际上,我使用 Azure Sql 进行了尝试,并且成功了。你是对的,因为我没有用 sql 2016 尝试过。
  • @sarslan 在我的回答中In SQL Server 2017 and in Azure SQL Database, you can provide a variable as the value of path. Azure 总是领先于本地 :)

标签: c# tsql dapper sql-server-2016 json-query


【解决方案1】:

我在 SQL Server 中尝试过,它工作正常

首先你错过了一件重要的事情variable vs literal

在 SSMS 中使用时,它不适用于 SQL Server 2016

CREATE TABLE MyTAble(ID INT IDENTITY(1,1), JsonColumn NVARCHAR(MAX));

INSERT INTO MyTable( JsonColumn)
VALUES('{"Name":123}');


-- it will work
SELECT [Id] FROM [dbo].[MyTable]
WHERE JSON_VALUE([JsonColumn], '$.Name') = '123';

-- let''s try your example
DECLARE @Path NVARCHAR(MAX) = '$.Name';
SELECT [Id] FROM [dbo].[MyTable]
WHERE JSON_VALUE([JsonColumn], @Path) = '123';

DBFiddle Demo

你会得到:

“JSON_VALUE 或 JSON_QUERY”的参数 2 必须是字符串字面量。


SQL Server 2017+ 开始,您可以将路径作为变量传递。来自JSON_VALUE

路径

指定要提取的属性的 JSON 路径。更多 信息,请参阅 JSON 路径表达式 (SQL Server)。

在 SQL Server 2017 和 Azure SQL 数据库中,您可以提供 变量作为路径的值。

DbFiddle Demo 2017


最后要让它在SQL Server 2016 上工作,您可以使用连接(而不是参数绑定)来构建您的查询字符串。

警告!这可能会导致严重的安全问题和 SQL 注入攻击。

【讨论】:

  • 如果有人遇到这些问题,请注意:即使我实际上使用的是字符串文字,我在 SQL Server 2016 上也遇到了这个错误。问题是我正在使用强制参数化。所以我的解决方案是暂时切换到简单参数化,运行查询,然后再次切换到强制参数化。
  • @TomPažourek 很棒的观察。
猜你喜欢
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 2021-10-14
  • 2020-07-15
  • 1970-01-01
  • 2017-09-16
相关资源
最近更新 更多