C#Dapper对SQL Server 2016使用JSON_VALUE [英] C# Dapper using JSON_VALUE for SQL Server 2016

查看:97
本文介绍了C#Dapper对SQL Server 2016使用JSON_VALUE的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to query data from my table using 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中尝试过,它正在工作:

I try this in SQL Server, it is working:

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

我应该如何调整代码?

推荐答案


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

I try this in SQL Server, it working

首先,您错过了变量文字相比重要的事情。

First of all you miss one important thing variable vs literal.

在SSMS中使用时,它将无法在 SQL Server 2016 上运行:

It won't work on SQL Server 2016 when used in 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';

DBFiddle演示

DBFiddle Demo

您将获得:


JSON_VALUE或JSON_QUERY的参数2必须为字符串文字。






来自 SQL Server 2017 + 的第二个,您可以将路径作为变量传递。来自 JSON_VALUE


Second from SQL Server 2017+ you could pass path as variable. From JSON_VALUE:


路径

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

A JSON path that specifies the property to extract. For more info, see JSON Path Expressions (SQL Server).

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

2017年DbFiddle演示

DbFiddle Demo 2017

最后要使其在 SQL Server 2016 上运行,您可以使用串联(而不是参数绑定)构建查询字符串。

And finally to get it work on SQL Server 2016 you may build your query string using concatenation (instead of parameter binding).

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

Warning! This could lead to serious security problem and SQL Injection attacks.

这篇关于C#Dapper对SQL Server 2016使用JSON_VALUE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆