TSQL PATINDEX / CHARINDEX用于查找连续的换行符

时间:2014-09-03 04:53:10

标签: sql-server sql-server-2008 tsql

考虑SQL Server中的nvarchar列,其中包含以下字符串

"Test line



Test line after four line breaks."

如果我在notepad ++中粘贴数据并启用符号,我可以在前面提到的字符串中看到四个换行符(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(回车寿命馈送),但当我输出我在TSQL中使用ASCII功能遇到换行符的每个字符时,它给了我

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

对此有任何解释!?

1 个答案:

答案 0 :(得分:3)

UPDATE / EDIT

CRLF是回车/换行的缩写。这是古老的术语,在词语的字面意义上大多被弃用。

"现代"系统没有要返回的托架,即使没有给出该命令,新文本也会从左侧开始。有些程序在按下输入时总是提供完整的CRLF,但也有程序只发送换行符。然后有最糟糕的类型,在结束带有文本的行时提供完整的CRLF,但是当剩下的行为空时只提供换行符。这在技术上是一种最佳化"因为嘿,为什么"归还马车"当它从未离开起始位置时。

这一切都非常好但你如何解决它?

使用完整集替换所有未跟随char(10)的char(13)。仔细看看如何做到这一点,因为如果你弄错了,你可能会无限期地在循环中插入CRLF;)

结束编辑

我已经完全按照您的描述进行了尝试,请参阅下面的代码示例。它应该像你描述的那样工作。对于一些额外的测试,我甚至将换行符插入引用的文本,工作。即使是数据类型文本,这是我可能行为不端的第一个猜测似乎完全支持这一点。我第一次用自己的系统在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