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

SQL Serverは、ストアドプロシージャ内のvarcharをサイレントに切り捨てます

    ただ

    ただし、私のチェックの1つは、パラメーターがテーブルの列の長さと一致することを確認することであるため、問題に気づいたことはありません。クライアントコードでも。個人的には、SQLで長すぎるデータが表示されることはないと思います。切り捨てられたデータを見た場合、それを引き起こした原因は明らかです。

    varchar(max)の必要性を感じた場合は、データ型の優先順位のために、パフォーマンスの大きな問題に注意してください。 varchar(max)はvarchar(n)よりも優先順位が高くなります(最長が最高です)。したがって、このタイプのクエリでは、シークではなくスキャンが取得され、すべてのvarchar(100)値はCASTからvarchar(max)になります

    UPDATE ...WHERE varchar100column = @varcharmaxvalue
    

    編集:

    この問題に関する未解決のMicrosoftConnectアイテムがあります。

    そして、それはおそらくErland SommarkogのStrict設定(および一致するConnectアイテム)に含める価値があります。

    マーティンズのコメントの後、編集2:

    DECLARE @sql VARCHAR(MAX), @nsql nVARCHAR(MAX);
    SELECT @sql = 'B', @nsql = 'B'; 
    SELECT 
       LEN(@sql), 
       LEN(@nsql), 
       DATALENGTH(@sql), 
       DATALENGTH(@nsql)
    ;
    
    DECLARE @t table(c varchar(8000));
    INSERT INTO @t values (replicate('A', 7500));
    
    SELECT LEN(c) from @t;
    SELECT 
       LEN(@sql + c), 
       LEN(@nsql + c), 
       DATALENGTH(@sql + c), 
       DATALENGTH(@nsql + c) 
    FROM @t;
    


    1. SQL Serverのインラインテーブル値関数(ITVF)の概要

    2. SQLServerからメールを送信するときの「プロファイル名が無効です」を修正

    3. Dockerを使用してTimescaleDBをデプロイするためのガイド

    4. MySQLでNull値を比較する方法