【问题标题】:how to correctly substitute query/route parameter in Azure Function Cosmos DB input binding sqlQuery如何正确替换 Azure Function Cosmos DB 输入绑定 sqlQuery 中的查询/路由参数
【发布时间】:2022-06-20 11:18:31
【问题描述】:

SQL、函数和 cosmos db 的新手,抱歉

我正在使用 Javascript,尝试使用 http 触发器中的一些路由参数和查询参数,使用其输入绑定从 cosmos db 检索数据。

在 cosmos db 输入绑定的“sqlQuery”中,这些路由/查询参数可以用 {key} 引用。当我尝试在 SELECT 子句中使用 {key} 时,它被解析为字符串并导致一些问题。

  1. 我想使用 TOP n 过滤,因为 {max} 被解析为字符串,我尝试使用 CAST/CONVERT 转换为数字,得到不同的错误。

"sqlQuery": "SELECT TOP {max} * FROM c" 错误:TOP 需要一个数字

"sqlQuery": "SELECT TOP CAST({max} AS int) * FROM c" 错误:语法接近

  1. 我想在 JSON 中选择一些属性,我想我应该使用 c[{telemetry}],它确实有效,但结果是带有键名 =“$1”的 JSON,

"sqlQuery": "SELECT TOP 10 c[{telemetry}] FROM c"

我得到 {$1: 25.3} 并且我期望类似 {temperature: 25.3}

  1. 如果我使用 AS 转换,会出现语法错误。

"sqlQuery": "SELECT TOP 10 c[{telemetry}] AS {telemetry} FROM c"

【问题讨论】:

    标签: azure-functions azure-cosmosdb


    【解决方案1】:

    所以首先,不要忘记清理你的替换 - 否则,你可以将函数暴露给 SQL 注入漏洞:https://docs.microsoft.com/en-us/azure/cosmos-db/sql/sql-query-parameterized-queries

    我如何看到你想要做的一个例子:

        const getObjectSql = {
            query: `SELECT TOP @limit * from q
                    WHERE q.id = @id
                        AND q.status = @status`,
            parameters: [
                {
                    name: "@limit",
                    value: parseInt(limit ?? "10"),
                },
                {
                    name: "@id",
                    value: id,
                },
                {
                    name: "@status",
                    value: status,
                },
            ],
        };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      相关资源
      最近更新 更多