2

我正在创建一个视图来获取数据库 X 中名为 ScopeContent 的列的子字符串,它的数据类型为 ntext。当我在视图中查看 ScopeContent 的值时,一些数据为空,而另一些则有数据。例如,第一条记录的数据长度为 33000,但在我创建的视图中显示为 (NULL),第二条记录的数据长度为 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),第二条记录的数据长度为 91578,它在视图中显示数据...

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

和查询不一致。当您尝试使用substring函数数据从 64002 字节位置(32001 个字符)提取时,您的数据显然小于 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.aspxhttp://www.sqlservercentral.com/Forums/Topic431183-8-1 .aspx),而子字符串 afaik 适用于字符。一个字符不一定是一个字节。因此,您可能会遇到麻烦,因为数据长度超过 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 函数返回字符串的字符数,datalenght 是字节数,是字符数的两倍。

于 2016-03-11T22:41:55.150 回答