C#Dapper使用JSON_VALUE进行SQL Server 2016

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#Dapper使用JSON_VALUE进行SQL Server 2016相关的知识,希望对你有一定的参考价值。

我想使用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'

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

答案

我在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注入攻击。

以上是关于C#Dapper使用JSON_VALUE进行SQL Server 2016的主要内容,如果未能解决你的问题,请参考以下文章

多个节点同名时使用 Oracle SQL 获取 JSON_VALUE

sql MS SQL JSON_VALUE

在 PL/SQL 中出现错误“PLS-00201:必须声明标识符‘JSON_VALUE’”

SQL Server JSON_VALUE 语法

EFCore使用JSON_VALUE查询json对象的值

使用C#的DAPPER 进行增删改查操作(准备工作)