2017-10-21 195 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注入攻擊。