Как использовать параметр SQL для запроса CONTAINS в SQL API Azure Cosmos DB? - PullRequest
2 голосов
/ 18 марта 2019

У меня есть следующая переменная sql:

SELECT * FROM x WHERE  x.Description CONTAINS(@p1)

Я настроил параметр SQL с именем @ p1 и допустимой строкой, например, "foo", и добавил его в переменную коллекции SqlParameterCollection со следующим:

var sqlQuery = new SqlQuerySpec(sql, collection);

Затем я вызываю следующий запрос.

var query = _documentClient.CreateDocumentQuery<T>(GetDocumentCollectionUri<T>(graphRequestContext), sqlQuery, options).AsDocumentQuery();

Я получаю следующую ошибку:

Сообщение: Microsoft.Azure.Documents.DocumentClientException: Сообщение: {«ошибки»: [{«серьезность»: «ошибка», «местоположение»: {«начало»: 37, «конец»: 45}, «код»: «SC1001», «сообщение»: «синтаксическая ошибка, неверный синтаксис»)рядом с 'CONTAINS'. "}]} ActivityId: <<strong> Удалено по соображениям конфиденциальности >, Microsoft.Azure.Documents.Common / 2.2.0.0, Windows / 10.0.17763 documentdb-netcore-sdk / 2.2.2

По документации (https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-query-reference), кажется, что он ищет строковое выражение. Таким образом, я ищу подтверждение на это, если это действительно так.

1 Ответ

1 голос
/ 18 марта 2019

Похоже, что вы используете CONTAINS в неверном синтаксисе. Пожалуйста, получите представление о правильном синтаксисе .

enter image description here

Пожалуйста, обратитесь к приведенному ниже коду, он работает для меня.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using System;

namespace DocumentDB.TestClass
{
    class CreateBySqlParam
    {
        private static readonly string endpointUrl = "https://***.documents.azure.com:443/";
        private static readonly string authorizationKey = "***";
        private static readonly string databaseId = "db";
        private static readonly string collectionId = "***";

        private static DocumentClient client;

        public static async void QueryTest()

        {
            client = new DocumentClient(new Uri(endpointUrl), authorizationKey);
            var uri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);

            IQueryable<Pojo> queryable = client.CreateDocumentQuery<Pojo>(
                                                uri,
                                                new SqlQuerySpec
                                                {
                                                    QueryText = "SELECT c.id,c.name FROM c WHERE contains(c.name,@param)",
                                                    Parameters = new SqlParameterCollection()
                                                    {
                                                        new SqlParameter("@param", "n")
                                                    }

                                                }
            );

            foreach (Pojo p in queryable)
            {
                Console.WriteLine("\nRead {0}", p);
            }
        }
    }

    class Pojo : Document
    {
        public string id { get; set; }
        public string name { get; set; }
    }

}

Вывод:

enter image description here

...