【问题标题】:Parameterized OPENJSON in SQL Server query using Entity Framework Core使用 Entity Framework Core 的 SQL Server 查询中的参数化 OPENJSON
【发布时间】: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 函数内的参数。

寻找安全的解决方法。

【问题讨论】:

  • 分享完整的堆栈跟踪!

标签: c# json sql-server entity-framework asp.net-core


【解决方案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 是否执行一些内部语法检查?不过我不相信。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 2020-05-29
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
相关资源
最近更新 更多