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函数直接解决吗?
试试这个 :
select id, text,LEN(Text)-LEN(replace(text,char(10),''))+1 LinesOfText
from Example
Run Code Online (Sandbox Code Playgroud)
试试这个 -
查询:
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)