考虑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
对此有任何解释!?
答案 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