C#Dapper使用JSON_VALUE进行SQL Server 2016

问题描述 投票:5回答:1

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

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

c# tsql dapper sql-server-2016 json-query
1个回答
7
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.