2012-08-01 56 views
1

我遇到的問題是,如果值包含CR/LF值(不是結尾),則varchar的長度將無法正確返回。SQL Server 2000 LEN函數只返回第一次出現回車/換行

例如,下面的查詢片段:

數據是一樣的東西:

<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 [email protected] 

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), '') 

,但希望有可能其他功能或設置重寫的行爲。

+2

DataLength()返回什麼? – HABO 2012-08-01 14:25:43

+1

在你的示例數據文字中是'[CR/LF]'還是換行符?我問,因爲你已經使用了多條線來表示數據。 – 2012-08-01 14:26:48

+2

你能發佈實際的代碼嗎?我懷疑你發佈的內容有些模糊,因爲'@ xml_value'只出現在最後一行,並且從未設置 - 實際代碼中實際上有兩個不同的變量('@ xmldata'和'@ xml_value') ? – 2012-08-01 14:37:33

回答

0

下返回35(不33)在SQL Server 2008 R2兩次:

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

它看起來我的權利。

+0

你是正確的應該是'35' – 2012-08-02 09:55:58

+0

2005年,我不能回購這兩種,只有在SQL2000看到這,今天將嘗試使用datalength()並稍後返回 – 2012-08-02 09:57:22