2017-10-21 142 views
2

我想用JSON_VALUE查询到我的表中的数据:C#小巧玲珑使用JSON_VALUE为SQL Server 2016

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' 

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

+0

我建议你创建一个存储过程并放弃你的json字符串作为参数并在那里处理它。 – Valkyrie

+0

我在本地环境中试过这段代码。它能正常工作。代码有什么问题? –

+0

@sarslan它不会工作,因为OP将它传递为文字,而在C#中,他试图将它作为变量传递。 SQL Server中的唯一方法是使用动态SQL或在C#代码中构建查询字符串。 – lad2025

回答

2

我尝试这在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

您将获得:

的参数2“JSON_VALUE或JSON_QUERY的“必须是字符串文字。从SQL Server 2017+


其次,你可以通过路径变量。从JSON_VALUE

路径指定属性提取

一个JSON路径。有关更多 信息,请参阅JSON路径表达式(SQL Server)。

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

DbFiddle Demo 2017


终于搞定它SQL Server 2016工作,你可以使用串联构建查询字符串(而不是参数绑定)。

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