使用 Entity Framework Core 的 SQL Server 查询中的参数化 OPENJSON
Posted
技术标签:
【中文标题】使用 Entity Framework Core 的 SQL Server 查询中的参数化 OPENJSON【英文标题】:Parameterized OPENJSON in SQL Server query using Entity Framework Core 【发布时间】:2019-02-09 08:36:19 【问题描述】: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 Server 不会替换参数,因为它是 OPENJSON
函数内的参数。
寻找安全的解决方法。
【问题讨论】:
分享完整的堆栈跟踪! 【参考方案1】:这在 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)
【讨论】:
我正在完全复制它,但我仍然收到“'+' 附近的语法不正确”。知道为什么吗? @J.Doe 如果您更改了代码,请在您的问题中添加新代码!【参考方案2】: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 或任何其他用于管理数据库的工具中的 OPENJSON 路径参数中。 @J.Doe 这应该可以正常工作,David Browne 的 SQL 也对我有用。不知道为什么它会给你语法错误。你在 SMSS 里面试过吗?似乎不是代码,而是其他东西被破坏了。您是否尝试过使用纯字符串作为不带参数的路径?您是否尝试将完整路径放入参数中,包括。$.
?
是的,我在 SMSS 内部尝试过。是的,我尝试在没有参数的情况下使用纯字符串作为路径,它确实有效。是的,我的参数中的$.
@J.Doe 如果尝试使用 System.Data.SqlClient 下的 .NET 功能使用 David Browne 的 SQL,即使使用参数也可以正常工作。我想知道 EF Core 是否执行一些内部语法检查?不过我不相信。以上是关于使用 Entity Framework Core 的 SQL Server 查询中的参数化 OPENJSON的主要内容,如果未能解决你的问题,请参考以下文章
在 Entity Framework Core 中使用 [ComplexType]
在 Entity Framework Core 中使用 SQL 视图
使用 Entity Framework Core 更新相关数据