C#Dapper使用JSON_VALUE进行SQL Server 2016

Gar*_*ary 5 c# t-sql dapper sql-server-2016 json-query

我想使用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
      }
   );
}
Run Code Online (Sandbox Code Playgroud)

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

SELECT [Id] FROM [dbo].[MyTable]
WHERE JSON_VALUE([JsonColumn], '$.Name') = '123'
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*zda 7

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

首先你错过了一个重要的事情variableVS literal.

SQL Server 2016在SSMS中使用时不起作用:

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';
Run Code Online (Sandbox Code Playgroud)

DBFiddle演示

你会得到:

"JSON_VALUE或JSON_QUERY"的参数2必须是字符串文字.


第二个SQL Server 2017+你可以传递路径作为变量.来自JSON_VALUE:

路径

一个JSON路径,指定要提取的属性.有关详细信息,请参阅JSON路径表达式(SQL Server).

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

DbFiddle演示2017


最后,为了使它能够工作,SQL Server 2016你可以使用连接(而不是参数绑定)来构建查询字符串.

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