2

データベース X の ScopeContent という名前の列の部分文字列を取得するビューを作成しています。データ型は ntext です。ビューで ScopeContent の値を見ていると、一部のデータは null ですが、他のデータにはデータがあります。たとえば、最初のレコードのデータ長は 33000 ですが、作成したビューでは (NULL) と表示され、2 番目のレコードのデータ長は 91578 で、ビューにデータが表示されます。以下は私のSQL文です。

部分文字列の仕組みを正しく理解していれば、(列名、開始位置、長さ)

CREATE VIEW ScopeContent2 (CatId, ScopeContent) 
 AS 
SELECT CatId, SUBSTRING(ScopeContent,32001,32000) AS ScopeContent 
FROM X 
  WHERE datalength(ScopeContent)>32000

例えば

CatId      ScopeContent
-----      ------------
    1      (NULL)
    2      rem ipsum dolor sit amet, consectetur adipiscing elit. Nam sed arcu posuere, pellentesque elit sit amet, ultricies mauris. Curabitur nec metus hendreri
4

3 に答える 3

2

Datalength文字数ではなくバイト数をカウントします。この場合、2 バイト = 1 文字です。

SUBSTRINGバイト位置ではなく、文字位置を取ります。

この観点から、あなたの声明は

たとえば、最初のレコードのデータ長は 33000 ですが、作成したビューでは (NULL) と表示され、2 番目のレコードのデータ長は 91578 で、ビューにデータが表示されます...

CREATE VIEW ScopeContent2 (CatId, ScopeContent) AS SELECT CatId, SUBSTRING(ScopeContent,32001,32000) AS ScopeContent FROM X WHERE datalength(ScopeContent)>32000

とクエリが矛盾しています。関数データを使用して 64002 バイトの位置 (32001 文字) から抽出しようとするとsubstring、データは明らかに 64002 バイト未満です (ただし、WHERE句に従って 32000 バイトを超えます) 。

おそらく必要なのは、テキストの長さが32000を超える場合、32000文字の後にクエリのサブストリングが必要であることです

その場合、クエリは

CREATE VIEW ScopeContent2 (CatId, ScopeContent) 
 AS 
 SELECT 
     CatId, 
     SUBSTRING(ScopeContent,32001,32000) AS ScopeContent 
 FROM X 
 WHERE datalength(ScopeContent)>64000 --- double of original value
于 2016-03-11T23:06:06.740 に答える
0

部分文字列とデータ長を混在させることが問題になる可能性があると思います。Datalength はバイトを返します ( https://msdn.microsoft.com/de-de/library/ms173486%28v=sql.120%29.aspxおよびhttp://www.sqlservercentral.com/Forums/Topic431183-8-1を参照)。 .aspx )、部分文字列 afaik は文字で動作します。1 文字は必ずしも 1 バイトではありません。したがって、データ長が 32000 を超えるのに文字列が 20000 文字しかないため、問題が発生する可能性があります (1 文字が 2 バイトの場合、20000 文字の文字列は 40000 バイトになります)。

私はこれでdnoethが正しいかもしれないと思います.彼は少し速かったです:)

于 2016-03-11T22:51:30.457 に答える
0

あなたが試すことができます:

CREATE VIEW ScopeContent2 (CatId, ScopeContent) 
         AS 
     SELECT CatId, SUBSTRING(ScopeContent,32001,32000) AS ScopeContent 
       FROM X 
      WHERE LEN(CAST(ScopeContent AS NVARCHAR(MAX))) > 32000

または

CREATE VIEW ScopeContent2 (CatId, ScopeContent) 
         AS 
     SELECT CatId, SUBSTRING(ScopeContent,32001,32000) AS ScopeContent 
       FROM X 
      WHERE DataLength(ScopeContent) > 64000

Len 関数は文字列の文字数を返します。datalength はバイト数で、文字数の 2 倍です。

于 2016-03-11T22:41:55.150 に答える