2014-09-03 77 views
1

考慮它與下面的字符串在SQL Server中的nvarchar列TSQL PATINDEX/CHARINDEX找到連續換行符

"Test line 



Test line after four line breaks." 

我可以看到四個換行符(CRLF)在上述字符串,如果我粘貼數據在記事本++和啓用符號。我只是想知道如果下面的TSQL語句是正確的重新發現這個字符串,

SELECT PATINDEX('%'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+'%', DataField) From Foo 

不幸的是這個查詢沒有返回我的預期結果和整數返回值始終爲0想法?

預先感謝

編輯:

雖然文本顯示4套CRLF(回車生命飼料)在記事本++,當我輸出從那裏我使用ASCII函數遇到換行符的每一個字符在TSQL中,它給我

CHAR(13)CHAR(13)CHAR(10)CHAR(13)CHAR(13)CHAR(10) (e.g. \r\r\n\r\r\n) if I am not wrong 

任何解釋重新這個!?

回答

3

UPDATE/EDIT

CRLF是回車/換行的簡稱。這是古代的術語,大部分在詞的字面意義上被棄用。

對於「現代」系統,沒有回車,即使沒有給出該命令,新的文本從左側開始。有些程序在按下輸入時總是提供完整的CRLF,但也有程序只發送換行符。然後是最糟糕的一種,當用文本結束一行時,給出完整的CRLF,但當剩下的行爲空時,只有一個換行符。這在技術上是一種「最優化」,因爲嘿,爲什麼當它從未離開起始位置時「歸還馬車」。

這就是所有非常好,但你如何解決它?

將全部字符(13)全部替換爲char(10)後面的全部字符。 )

編輯完

我試過你的描述到底是什麼,請參見下面的代碼示例;在如何做到這一點,因爲如果你弄錯了,你可能會去上一個循環indefinitly插入CRLFs仔細看。它應該像你描述的那樣工作。對於一些額外的測試,我甚至會將換行符作爲帶引號的文本插入,起作用。即使數據類型的文本,這是我的第一次猜測可能行爲不端行爲似乎完全支持這一點。我在2012年第一次在自己的系統上運行了這個功能,但是在2008年實現了您的問題,因此我在2008年的小提琴上測試了它,並得到了相同的結果。

結論:這個問題是不是在選擇上換行符PATINDEX;)

create table crlf_test (id int identity(1,1), nstring nvarchar(100), string varchar(100), n_text ntext) 

insert crlf_test (nstring, string, n_text) values 
('a'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+'b','a'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+'b','a'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+'b'), 
('a 

b','a 

b','a 

b') 

select * from crlf_test 
select patindex('a'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+'b', nstring) 
    , patindex('a'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+'b', string) 
    , patindex('a'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+'b', n_text) 
from crlf_test 
select patindex('a 

b', nstring) 
    , patindex('a 

b', string) 
    , patindex('a 

b', n_text) 
from crlf_test 
+0

請參閱編輯 – MSI 2014-09-03 23:59:37

+0

我會接受你的編輯:)。乾杯 – MSI 2014-09-05 03:57:25