none
エラスティッククエリでWHERE句に'default'という値を使うとエラーになる RRS feed

  • 質問

  • Azure上に

    ・AzureSQLデータベースA(以下DBA)

    ・AzureSQLデータベースB(以下DBB)

    の2つのデータベースがあり(サーバは同じです)、

    DBBからDBAのエンティティを参照するため(シノニムのよう)に、エラスティッククエリを利用しようとしておりますが、

    実際にDBBからクエリを実行したところ、WHERE句に'default'という値を指定すると以下のようなエラーになってしまいます。

    Error retrieving data from xxxx.database.windows.net.xxxx. 

    The underlying error message received was: 'Incorrect syntax near the keyword 'DEFAULT'.'.

    ※ちなみに、

    ・DBAからのクエリ実行であればエラーにはなりません。

    ・DBBからのクエリ実行であっても、WHERE句の値が'default'でなければエラーにはなりません。

    どなたか、

    同様の症状に行き当たったことがある方や、回避策などをご存じの方はいらっしゃいませんでしょうか?

    よろしくお願いいたします。

    本件について実行したDDLは以下のとおりです。

    ■DBA
    create table entity_name (
    column nvarchar(128) not null,
    ・・・
    ・・・
    );

    ■DBB

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'xxxx';

    CREATE DATABASE SCOPED CREDENTIAL erastic_credential
    WITH IDENTITY = 'xxxx',SECRET = 'xxxx';

    CREATE EXTERNAL DATA SOURCE erastic_data_source WITH
       (TYPE = RDBMS,
        LOCATION = 'xxxx.database.windows.net',
        DATABASE_NAME = 'xxxx',
        CREDENTIAL = erastic_credential,
    );

    create external table entity_name (
    column nvarchar(128) not null,
    ・・・
    ・・・
    ) with (DATA_SOURCE = erastic_data_source);

    ※DBB上で実行するクエリ
    select * from entity_name where column = 'default';

    2019年11月18日 1:13

すべての返信

  • ohigetanuさん、こんにちは。フォーラムオペレーターのクモです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご質問によると、これは「デフォルト値」に関連していないと思うので、
    別の値を変更して、同じエラーが発生するかどうかをご確認ください。

    どうぞよろしくお願いいたします。 


    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年11月20日 7:45
    モデレータ
  • クモさん、ご回答ありがとうございます。

    以下のSQLを、

    select * from entity_name where column = 'default';

    ■DBBで実行(エラスティッククエリ)

    ・エラーになります。

    ■DBAで実行(データソース側なので普通のクエリ)

    ・エラーにはなりません。

    以下のSQLを、

    select * from entity_name where column = 'aaaaa';

    ■DBBで実行(エラスティッククエリ)

    ・エラーになりません。

    ■DBAで実行(データソース側なので普通のクエリ)

    ・エラーにはなりません。

    ※エラスティッククエリで外部テーブルにアクセスする場合は、

    どのテーブルのどのカラムに対しても、'default'というワードをWHERE句に指定するとエラーになります。

    ※'update'や'with'や'group'なども試してみましたが、エラーにはなりませんでしたので、

    予約語だからダメっていうことではないのかなと思っています。

    2019年11月21日 0:50
  • 簡単に現象が再現しますね。 WHERE条件が'default'の場合、以下のようにクエリが書き換えられて実行されていました。
    問題は、" WHERE  ([T2_1].[col1] = DEFAULT)) AS T1_1" の部分で、このクエリの書き方では、Syntaxエラーが発生しますね。
    製品側の不具合(考慮不足)のような感じがします。条件句に'default'という条件でElastic Queryを実行する必要がある場合は、マイクロソフトのサポートにお問い合わせしてみるとよいかもしれません。

    # WHERE条件が'default'の場合
    ---
    SELECT [T1_1].[col1] AS [col1]
    FROM   (SELECT [T2_1].[col1] AS [col1]
            FROM   [dbo].[tab1] AS T2_1
            WHERE  ([T2_1].[col1] = DEFAULT)) AS T1_1 <-- ここが問題
    ---

    # WHERE条件が'grop'の場合
    ---
    SELECT [T1_1].[col1] AS [col1]
    FROM   (SELECT [T2_1].[col1] AS [col1]
            FROM   [dbo].[tab1] AS T2_1
            WHERE  ([T2_1].[col1] = CAST (N'grop' COLLATE Japanese_CI_AS AS NVARCHAR (4000)) COLLATE Japanese_CI_AS)) AS T1_1
    ---
    2020年1月17日 16:48
  • あまりよい対処方法ではないのですが、以下のようにクエリを書き換えることで、syntax エラーは解消できました。
    ---
    select * from entity_name where column  = cast('default' as varchar(50));
    ---
    2020年1月17日 16:59
  • 影響が少なく、回避策が見つかっている状況ですので、改修される可能性は低そうですが、フィードバックを念のため出してみました。

    A syntax error occurs when you execute an elastic query on Azure SQL Database.
    https://feedback.azure.com/forums/217321-sql-database/suggestions/39520285-a-syntax-error-occurs-when-you-execute-an-elastic


    2020年1月25日 15:51