获取MS SQL中特定varchar的行数
在MS SQL Server 2012中,我有一个数据库,其中有一个表,其中包含一个varchar列,其中包含一些甚至可能包含换行符的文本 基本示例:获取MS SQL中特定varchar的行数,sql,sql-server,xml,tsql,lines-of-code,Sql,Sql Server,Xml,Tsql,Lines Of Code,在MS SQL Server 2012中,我有一个数据库,其中有一个表,其中包含一个varchar列,其中包含一些甚至可能包含换行符的文本 基本示例: CREATE TABLE Example ( [ID] INT , [Text] VARCHAR(100) ); INSERT INTO Example ([ID], [Text]) VALUES (1, 'This is a test'), (2, 'This is another
CREATE TABLE Example
(
[ID] INT
, [Text] VARCHAR(100)
);
INSERT INTO Example ([ID], [Text])
VALUES
(1, 'This is a test'),
(2, 'This is another
test with
two line breaks'),
(3, 'This is a test
with one line break');
现在我想得到每条记录的总文本行数,例如:
--------------------
| ID | LinesOfText |
--------------------
| 1 | 1 |
--------------------
| 2 | 3 |
--------------------
| 3 | 2 |
--------------------
不幸的是,像这样的东西似乎没有内置函数。我的想法是计算Chr(10)+Chr(13)
的出现次数,并在末尾加1。但是CHARINDEX
只查找字符串中的第一个匹配项
你知道怎么解决这个问题吗
可能有用的额外信息:为了更深入地了解我的数据,“文本”来自包含换行符的XML字符串,例如
...
<a>This is
another test
with two line breaks</a>
...
。。。
这是
另一个测试
有两个换行符
...
我使用
交叉应用XML.nodes(…
和XPath来查找XML中的所有
节点。这可以通过T-SQL XML函数直接解决吗?使用替换
通过不替换('
)来消除换行符。然后您可以从原始文本中减去修改文本的长度。尝试以下操作:
select id, text,LEN(Text)-LEN(replace(text,char(10),''))+1 LinesOfText
from Example
试试这个-
查询:
DECLARE @XML XML
SELECT @XML = '<p>
<a>This is a test</a>
<a>This is
another test
with two line breaks</a>
<a>This is a test
with one line break</a>
</p>'
SELECT
id = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
, LinesOfText = LEN(txt) - LEN(REPLACE(txt, CHAR(10), '')) + 1
FROM (
SELECT txt = t.c.value('.', 'VARCHAR(MAX)')
FROM @XML.nodes('p/a') t(c)
) t
id LinesOfText
-------------------- --------------------
1 1
2 3
3 2
这种方法一点也不聪明,我认为使用replace的示例更为优雅,但这是一个非常简单的例子:
CREATE FUNCTION dbo.fn_LinesOfText(@Text varchar(MAX)) Returns INT As
Begin
Declare @Result int, @LastOffset int
SET @LastOffset=0
SET @Result=1
SET @LastOffset=CHARINDEX(CHAR(10), @Text, @LastOffset)
WHILE @LastOffset>=1 BEGIN
SET @Result=@Result+1
SET @LastOffset=CHARINDEX(CHAR(10) ,@Text, @LastOffset+1)
END
Return @Result
End
@马库斯:这有帮助吗?谢谢你的回答和示例!工作正常!谢谢,已经更改了。我从sqlfiddle.com复制了它,但不知道我处于MySQL模式。谢谢你的帮助,LEN()和REPLACE()这是我所需要的。感谢您展示了如何实现我的第一种方法,这对其他想要编写自己的函数的人也很有用。这对我来说很好。我在传入参数中将varchar(MAX)更改为nvarchar(MAX)。谢谢您Kevin。我如何计算非空行?