![](/img/trans.png)
[英]Entity Framework Core; using ORDER BY in query against a (MS) SQL Server
[英]Parameterized OPENJSON in SQL Server query using Entity Framework Core
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
替換,但事實並非如此,拋出path.to.data
並出現以下錯誤:
System.Data.SqlClient.SqlException:'@path' 附近的語法不正確。
似乎 SQL 服務器沒有替換參數,因為它是OPENJSON
函數內部的參數。
尋找安全的解決方法。
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"));
這在 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.