获取MS SQL中特定varchar的行数

Mar*_*kus 5 xml sql t-sql sql-server 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
         test with
         two line breaks'),
        (3, 'This is a test
         with one line break');
Run Code Online (Sandbox Code Playgroud)

现在我想获得每条记录的总文本行,即:

--------------------
| ID | LinesOfText |
--------------------
|  1 |           1 |
--------------------
|  2 |           3 |
--------------------
|  3 |           2 |
--------------------
Run Code Online (Sandbox Code Playgroud)

不幸的是,似乎没有像这样的东西的内置函数.我的想法是计算Chr(10)+Chr(13)出现次数并在最后加1.但CHARINDEX只能在字符串中找到第一个匹配项.

不知道怎么解决这个问题?

可能有用的额外信息:为了更深入地了解我的数据,"文本"来自包含换行符的XML字符串,例如

...
<a>This is
   another test
   with two line breaks</a>
... 
Run Code Online (Sandbox Code Playgroud)

我使用CROSS APPLY XML.nodes(...XPath来查找<a>XML中的所有节点.这可以通过T-SQL XML函数直接解决吗?

jue*_*n d 7

用于Replace通过替换为nothing('')来消除换行符.然后,您可以从原始文本中减去修改后的文本的长度.


Rav*_*ngh 6

试试这个 :

select id, text,LEN(Text)-LEN(replace(text,char(10),''))+1 LinesOfText
from Example 
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回答和榜样!工作正常! (3认同)

Dev*_*art 6

试试这个 -

查询:

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
Run Code Online (Sandbox Code Playgroud)

输出:

id                   LinesOfText
-------------------- --------------------
1                    1
2                    3
3                    2
Run Code Online (Sandbox Code Playgroud)