Параметризованный OPENJSON в запросе SQL Server с использованием Entity Framework Core - PullRequest
0 голосов
/ 04 сентября 2018
context.Set<BlogKeyValuePair>()
   .FromSql("SELECT [key], value FROM OPENJSON((SELECT JsonData FROM dbo.Blogs WHERE BlogId=1), '$.@path')", 
        new SqlParameter("@path", "path.to.data"));

При первом визировании это должно работать правильно, и @path следует заменить на path.to.data, но это не так, возникает исключение SqlException со следующей ошибкой:

System.Data.SqlClient.SqlException: неправильный синтаксис рядом с'@path'.

Похоже, что SQL-сервер не заменяет параметр, потому что это параметр внутри функции OPENJSON.

Ищем безопасные обходные пути.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Это работает для меня в SSMS, поэтому ответ @ marsze должен работать.

declare @path nvarchar(2000) = 'ArrayValue';

DECLARE @json NVARCHAR(4000) = N'{  
   "StringValue":"John",  
   "IntValue":45,  
   "TrueValue":true,  
   "FalseValue":false,  
   "NullValue":null,  
   "ArrayValue":["a","r","r","a","y"],  
   "ObjectValue":{"obj":"ect"}  
}'

SELECT *
FROM OPENJSON(@json, '$.' + @path)
0 голосов
/ 04 сентября 2018

SQL не распознает переменную, потому что вы помещаете ее в строку:

-- Wrong:
OPENJSON((SELECT JsonData FROM dbo.Blogs WHERE BlogId = 1), '$.@path')

-- Correct:
OPENJSON((SELECT JsonData FROM dbo.Blogs WHERE BlogId = 1), '$.' + @path)

Код:

context
    .Set<BlogKeyValuePair>()
    .FromSql(@"
        SELECT [key], value
        FROM OPENJSON((SELECT JsonData FROM dbo.Blogs WHERE BlogId = 1), '$.' + @path)",
        new SqlParameter("@path", "path.to.data"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...