C#Dapper使用JSON_VALUE进行SQL Server 2016

时间:2017-10-21 06:43:14

标签: c# tsql 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
      }
   );
}

我在SQL Server中尝试这个,它正在运行:

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

我应该如何调整代码?

1 个答案:

答案 0 :(得分:7)

  

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

首先,您错过了一件重要的事情literal vs 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';

SQL Server 2017+

<强> DBFiddle Demo

你会得到:

  

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

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

  

<强>路径

     

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

     

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

<强> DbFiddle Demo 2017

最后要让它在get(id: string): Promise<Task> { return new Promise((resolve, reject) => { this.tasks.findOne({_id: id}).exec(function (err, doc) { console.log("Getting task: ", doc); if (err) reject(err); else resolve(<Task>doc); }); }); } 上运行,你可以使用连接(而不是参数绑定)来构建查询字符串。

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