0

同僚の1人がSQLServer2000を使用していて、データ型を使用するXML列が表示されるという表示の問題が発生していntextます<Long Text>。文字の長さが短すぎるためだと思います(16)が、変更できません。

データ型を変更しようとするとvarchar、警告が表示されます。データ型をから変更すると、テーブルのデータntextvarchar/nvarchar影響しますか?

4

1 に答える 1

3
  1. に変更するvarcharと、Unicode 情報が失われる可能性があります。

    DECLARE @x NVARCHAR(1) = NCHAR(257);
    
    SELECT @x, CONVERT(VARCHAR(1), @x);
    

    結果:

    ----  ----
    ā     a
    -- these are NOT the same!
    
  2. に変更するnvarchar(<=4000)と、8000 バイト (4000 文字) を超えるデータが失われる可能性があります。デザイナーntextが 4000 文字を超える文字を選択したが保存しなかった場合は問題ないかもしれませんが、最初にそれを確認する必要があります。

    SELECT COUNT(*) FROM dbo.table WHERE DATALENGTH(next_column) > 8000;
    

    これが 0 を返す場合、おそらく安全に に変換NVARCHAR(4000)できますが、SSMS ツールを使用して長いテキスト データを変更するのは簡単ではなく (それは目的ではありません)、アプリケーションに影響を与える可能性があります。

  3. 列に対して特別な処理を行うアプリケーションまたはストアド プロシージャがある場合があります。たとえば、 、および などntextの関数に依存している場合があります。コードベースでこれらのコマンドを検索する必要があります (これらを含む可能性のあるストアド プロシージャを調べる方法の 1 つを次に示します)。READTEXTWRITETEXTUPDATETEXTTEXTPTR

    SELECT o.name
      FROM sysobjects AS o
      INNER JOIN syscomments AS c
      ON o.id = c.id
      WHERE c.[text] LIKE '%READTEXT%'
         OR c.[text] LIKE '%WRITETEXT%'
         OR c.[text] LIKE '%UPDATETEXT%'
         OR c.[text] LIKE '%TEXTPTR%';
    

    誤検知の可能性があるため、「開始する方法は 1 つ」です。


しかし、私があなたの立場なら、型を変えるだけではありません

また、16 は文字の長さではありません (その列に 16 文字以上を収めることができます)。textデータはデータ ページにntext格納されません (1 ページに収まらないため)。16 バイトはポインターを表すバイト数であるため、ページが読み取られると、SQL Server に場所を伝えることができます。 、行外、実際のデータを探しに行きます。

本当の答えは、SSMS のグラフィカル ツールを使用してデータを表示 (特に変更) するのをやめることです。列の内容を表示したい場合はntext、部分文字列を選択できます。

SELECT CONVERT(NVARCHAR(4000), ntext_column) FROM dbo.table;

...またはアプリケーションでこれを行います。Open Tableただし、またはEDIT TOP n ROWSをスプレッドシートとして使用しないでください。

もう 1 つの本当の答えは、SQL Server 2000 を既にやめることです。最新バージョンの SQL Server には、より使いやすいデータ型nvarchar(max).

于 2013-01-29T20:14:04.827 に答える