获取MS SQL中特定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

在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
         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。我如何计算非空行?