5

我想使用以下方法从我的表中查询数据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'

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

4

1 回答 1

8

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

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

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

于 2017-10-22T15:12:52.453 回答