sql >> データベース >  >> RDS >> Sqlserver

SQLServerでのLEFT()とSET TEXTSIZEの違い:違いは何ですか?

    SET TEXTSIZEに精通している可能性があります SQL Serverのステートメント。これにより、SELECTで返されるデータの量を制限できます。 クエリ。

    おそらく、その結果はLEFT()とまったく同じであることがわかります。 特定のクエリを実行するとき。どちらが疑問を投げかけます:これらの2つのオプションの間に違いはありますか?

    これら2つのオプションには間違いなく違いがあります。両方の関数が完全に異なる結果を返す場合があります。また、それらの動作方法や、使用できるデータの種類にも違いがあります。

    定義

    まず、それぞれが何をするのかを見てみましょう。

    LEFT()
    指定された文字数の文字列の左側を返します。
    SET TEXTSIZE
    varchar(max)のサイズを指定します 、 nvarchar(max) varbinary(max)テキスト ntext 、および画像 SELECTによって返されるデータ ステートメント。

    これを詳しく調べてみましょう。

    文字とデータサイズ

    各定義の文言に注意してください。特に、「文字」と「サイズ」および「データ」という言葉。

    • LEFT() 文字の数を明示的に指定できます 返されます。
    • SET TEXTSIZE サイズを指定できます 返されたデータの。

    データ型によって結果が異なるため、これは重要な違いです。文字が異なれば、必要なストレージサイズも異なります。 1つの文字が1バイトを使用し、別の文字が2バイトを使用する場合があります。

    LEFT()の使用 使用するバイト数に関係なく、文字数を指定できます。

    SET TEXTSIZE 一方、バイト数を指定できます 戻る–しない 数字の文字。

    nvarchar(max)を使用してデータが保存されている場合 たとえば、SET TEXTSIZE LEFT()の半分の文字数を返します します。

    例:

    CREATE TABLE TextSizeTest (
        varchar50 varchar(50),
        varcharMax varchar(max),
        nvarcharMax nvarchar(max)
        ); 
    INSERT INTO TextSizeTest
    VALUES (
        'Dragonfruit',
        'Dragonfruit',
        'Dragonfruit'
        );
    
    SET TEXTSIZE 50;
    SELECT 
      LEFT(varchar50, 4) AS varchar50,
      LEFT(varcharMax, 4) AS varcharMax,
      LEFT(nvarcharMax, 4) AS nvarcharMax
    FROM TextSizeTest;
    
    SET TEXTSIZE 4;
    SELECT * FROM TextSizeTest;
    

    結果:

    +-------------+--------------+---------------+
    | varchar50   | varcharMax   | nvarcharMax   |
    |-------------+--------------+---------------|
    | Drag        | Drag         | Drag          |
    +-------------+--------------+---------------+
    (1 row affected)
    Commands completed successfully.
    +-------------+--------------+---------------+
    | varchar50   | varcharMax   | nvarcharMax   |
    |-------------+--------------+---------------|
    | Dragonfruit | Drag         | Dr            |
    +-------------+--------------+---------------+
    (1 row affected)
    

    最初の結果はLEFT()の場合です 。 3つのデータタイプとサイズすべてで機能します。指定された正確な文字数を返します。

    2番目の結果は、SET TEXTSIZEの場合です。 。 varchar(50)には影響しません 結果。他の2つにのみ影響します。しかし、それはそれらに異なった影響を及ぼします。 varchar(max)の場合 、各文字は1バイトを使用するため、指定されたTEXTSIZEと同じ数の文字が返されます。 。 nvarchar(max)の場合 それは別の話です。各文字は2バイトを使用するため、返される文字数は半分になります。

    ただし、LEFT()によって返される結果 SET TEXTSIZEの影響を受ける可能性があります 。 LEFT()を実行すると もう一度クエリを実行しますが、その前にSET TEXTSIZE 2を付けます 、これを取得します:

    SET TEXTSIZE 2;
    SELECT 
      LEFT(varchar50, 4) AS varchar50,
      LEFT(varcharMax, 4) AS varcharMax,
      LEFT(nvarcharMax, 4) AS nvarcharMax
    FROM TextSizeTest;
    

    結果:

    +-------------+--------------+---------------+
    | varchar50   | varcharMax   | nvarcharMax   |
    |-------------+--------------+---------------|
    | Drag        | Dr           | D             |
    +-------------+--------------+---------------+
    

    最大データサイズと固定データサイズ

    もう1つの違いは、SET TEXTSIZE varchar(max)でのみ機能します 、 nvarchar(max) varbinary(max)テキスト ntext 、および画像 データ。 maxに注意してください 部。固定データサイズ(varchar(255)など)を使用する場合 例)、SET TEXTSIZE 動作しません。

    LEFT() 一方、テキストを除くすべての文字データで機能します およびntext

    これらの違いは、前の例で確認できます。 varchar(50) データはLEFT()の影響を受けました ただし、SET TEXTSIZEではありません 。

    LEFT()はより具体的です

    もう1つの違いは、LEFT() 指定した列(または定数または変数)にのみ適用されます。複数の列/式に適用する場合は、式ごとに再度含める必要があります。後続のクエリと同じです。

    SET TEXTSIZE 一方、クエリで返される該当するすべての列に適用されます。また、別の値に設定されるまで、すべてのクエリに適用されます。


    1. MariaDB CURRENT_TIME()の説明

    2. ClusterControl1.8.2を使用したPostgreSQLv13のデプロイとスケーリング

    3. mysqlの最大クエリサイズはいくつですか?

    4. SQLServerクエリをMySQLに変換する