2017-10-21 10 views
2

ためJSON_VALUEを使用して、私はJSON_VALUEを使用して、私のテーブルからデータを照会する:C#Dapperの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

私はそれはあなたがliteral対1重要なことvariableを欠場すべての

まず作業、SQL Serverでこれを試してみてください。 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

あなたが取得します:

「JSON_VALUEまたはJSON_QUERYの引数2 "は文字列リテラルでなければなりません。


SQL Server 2017+からの第二は、変数としてパスを渡すことができます。 JSON_VALUEから:

パス

抽出するためのプロパティを指定するJSONパス。 の詳細については、「JSONパス式(SQL Server)」を参照してください。

SQL Server 2017およびAzure SQLデータベースでは、パスの値として 変数を指定できます。

DbFiddle Demo 2017


そして最後に、それはあなたが(代わりに、結合パラメータの)連結を使用して、クエリ文字列を構築することができるSQL Server 2016に取り組んで取得します。

警告!これにより、重大なセキュリティ上の問題やSQLインジェクション攻撃が発生する可能性があります。

関連する問題