none
COMPATIBILITY_LEVEL 90の時の浮動小数点データ型に対する算術演算子の NULL 値許容プロパティの仕様 RRS feed

  • 質問

  • COMPATIBILITY_LEVEL 90の際の浮動小数点データ型に対する算術演算子の NULL 値許容プロパティの仕様について日本語版と英語版でMSDNの記述が真逆なのですが、この場合どちらが正しいと考えたらよろしいでしょうか?またこれに限らず、MSDN上の記述が日本語版と英語版で相違する場合、どちらを正とするかについて明記されているページはございますでしょうか?

    英語版を正とすると、NULL値許容に変更されるのではなく、NULL値非許容に変更されるはずです。

    浮動小数点データ型に対する算術演算子の NULL 値許容プロパティは、入力が NULL 値非許容であり、かつ ANSI_WARNINGS が ON の場合に NULL 値許容に変更されます。https://msdn.microsoft.com/ja-jp/library/bb510680%28v=sql.100%29.aspx

    The nullability property of arithmetic operators over the floating point data type is changed to nonnullable for the case where the inputs are nonnullable and ANSI_WARNINGS is ON. https://msdn.microsoft.com/en-us/library/bb510680(v=sql.100).aspx

    何卒よろしくお願い致します。

    2015年5月15日 9:42

回答

  • 英語版が正しいですね。

    互換性レベルを変えながら以下を実行することで確認できるかと思います。

    SET ANSI_WARNINGS ON;
    GO
    
    DECLARE @temp TABLE(col1 float NOT NULL, col2 float NULL);
    
    INSERT INTO @temp VALUES(1.1, 1.1);
    
    SELECT col1 * col1 col11, col1 * col2 col12, col2 * col2 col122 INTO temp2 from @temp;
    
    SELECT c.name, c.is_nullable
    FROM sys.tables t
    INNER JOIN sys.columns c
    	ON t.object_id = c.object_id
    WHERE t.name = 'temp2';
    
    DROP TABLE temp2;

    COMPATIBILITY_LEVEL を 80 の DB では上記のクエリを実行すると、結果が 3 行とも is_nullable が 1 となります。
    COMPATIBIKITY_LEVEL を 90 の DB では上記のクエリを実行すると、col11 が is_nullable が 0 となります。


    MCITP(Database Developer/Database Administrator)

    • 回答の候補に設定 星 睦美 2015年5月18日 0:50
    • 回答としてマーク Tomotaro_MSDN 2015年5月18日 1:27
    2015年5月16日 12:43

すべての返信

  • 一般に、MSDNに日本語版オリジナルの記事はまずないので、日本語版と英語版で内容が違っていたら、それは「(英語から日本語に変換する際の)誤訳」とみていいとおもいます。

    jzkey

    • 回答の候補に設定 星 睦美 2015年5月18日 0:50
    2015年5月16日 11:29
  • 英語版が正しいですね。

    互換性レベルを変えながら以下を実行することで確認できるかと思います。

    SET ANSI_WARNINGS ON;
    GO
    
    DECLARE @temp TABLE(col1 float NOT NULL, col2 float NULL);
    
    INSERT INTO @temp VALUES(1.1, 1.1);
    
    SELECT col1 * col1 col11, col1 * col2 col12, col2 * col2 col122 INTO temp2 from @temp;
    
    SELECT c.name, c.is_nullable
    FROM sys.tables t
    INNER JOIN sys.columns c
    	ON t.object_id = c.object_id
    WHERE t.name = 'temp2';
    
    DROP TABLE temp2;

    COMPATIBILITY_LEVEL を 80 の DB では上記のクエリを実行すると、結果が 3 行とも is_nullable が 1 となります。
    COMPATIBIKITY_LEVEL を 90 の DB では上記のクエリを実行すると、col11 が is_nullable が 0 となります。


    MCITP(Database Developer/Database Administrator)

    • 回答の候補に設定 星 睦美 2015年5月18日 0:50
    • 回答としてマーク Tomotaro_MSDN 2015年5月18日 1:27
    2015年5月16日 12:43
  • ありがとうございます。

    私もおっしゃる通りに思うのですが、それに関してMicrosoft公式の文章による見解がどこにあるか探しても見つからなかったので伺った次第でございます。
    (Microsoft 開発者サービス契約(https://msdn.microsoft.com/ja-JP/cc300389)で'英語'や'訳'でページ内検索しても内容に相違がある場合にどちらを正とするということに関して明記されていないように思いました。)

    2015年5月18日 1:32
  • ありがとうございます。助かりました。
    2015年5月18日 1:35