我想使用JSON_VALUE
来查询我的表中的数据:
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 :(得分:7)
我在SQL Server中尝试这个,它正常工作
首先,您错过了一件重要的事情literal
vs SQL Server 2016
。
在SSMS中使用时,它不适用于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';
:
SQL Server 2017+
<强> DBFiddle Demo 强>
你会得到:
“JSON_VALUE或JSON_QUERY”的参数2必须是字符串文字。
从SQL Server 2016
开始,您可以将路径作为变量传递。来自JSON_VALUE:
<强>路径强>
指定要提取的属性的JSON路径。更多 info,请参阅JSON路径表达式(SQL Server)。
在SQL Server 2017和Azure SQL数据库中,您可以提供 变量作为路径的值。
<强> DbFiddle Demo 2017 强>
最后要让它在get(id: string): Promise<Task> {
return new Promise((resolve, reject) => {
this.tasks.findOne({_id: id}).exec(function (err, doc) {
console.log("Getting task: ", doc);
if (err)
reject(err);
else
resolve(<Task>doc);
});
});
}
上运行,你可以使用连接(而不是参数绑定)来构建查询字符串。
警告!这可能会导致严重的安全问题和SQL注入攻击。