【问题标题】:SQL Server 2000 LEN function only return length up to first occurrence of carriage return/linefeedSQL Server 2000 LEN 函数只返回到第一次出现回车/换行的长度
【发布时间】:2012-07-30 11:11:41
【问题描述】:

我遇到的问题是,如果值包含 CR/LF 值(不是尾随),则不会正确返回 varchar 的长度。

例如下面的查询sn -p:

数据类似于:

<xml><name>Name[CR/LF] Name</name></xml>

查询如下:

DECLARE @myid as INT
DECLARE @xmldata as VARCHAR(8000)
SET @myid = 1
SELECT @xmldata = xmldata FROM mytable WHERE id=@myid

PRINT 'The length is ' + CAST(LEN(@xmldata) AS VARCHAR(6))
PRINT 'Data:'
PRINT @xmldata

将输出:

The length is 15
Data:
<xml><name>Name[CR/LF] Name</name></xml>

我希望 LEN 函数返回 35 作为长度?

这是在 SQL Server 2000 SP4 (8.00.2065) 上

有谁知道是否有设置或其他功能可以防止这种情况发生。 我能想到的一个选项是删除选择中的回车和换行符:

SELECT @xmldata = REPLACE(REPLACE(REPLACE(REPLACE(xmldata, CHAR(13) + CHAR(10), ''), CHAR(10) + CHAR(13), ''), CHAR(13), ''), CHAR(10), '') 

但希望可能有其他功能或设置来覆盖该行为。

【问题讨论】:

  • DataLength() 返回什么?
  • 您的示例数据文字中是[CR/LF],还是换行符所在的位置?我问是因为您实际上使用了多行来表示数据。
  • 你能发布实际的复制代码吗?我怀疑您发布的内容有些捏造,因为@xml_value 仅出现在最后一行,并且从未设置过-您的真实代码中实际上是否有两个不同的变量(@xmldata@xml_value)?跨度>
  • @Tim,是的,[CR/LF] 是换行符所在,编辑器自动增加了 xml。
  • 严格的公司规则禁止发布代码:(.

标签: sql tsql sql-server-2000


【解决方案1】:

以下在 SQL Server 2008 R2 中两次返回 35(不是 33):

DECLARE @xmldata as VARCHAR(8000) 
SELECT @xmldata = '<xml><name>Name' + CHAR(13) + CHAR(10) + ' Name</name></xml>'
--                 000000000111111         1          1      112222222222333333
--                 123456789012345         6          7      890123456789012345
PRINT LEN(@xmldata)
print DataLength(@xmldata)
PRINT @xmldata 

我觉得很合适。

【讨论】:

  • 在 2005 年,我也不能回购这个,只能在 SQL2000 中看到,今天将尝试使用 datalength() 并稍后报告
猜你喜欢
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
相关资源
最近更新 更多