作者:啊啦思密达 | 来源:互联网 | 2024-12-14 10:14
T-SQL虽然功能强大,但在处理某些特定任务时,如字符串操作,可能会显得力不从心。例如,当需要遍历一个以逗号分隔的字符串(如 '1,2,3,4,5')时,由于T-SQL不支持数组,因此必须采用其他方法来实现类似的功能。
下面的自定义函数展示了如何使用临时表来模拟数组,从而实现字符串的分割:
ALTER FUNCTION [dbo].[SplitString] (@InputString VARCHAR(MAX), @Delimiter CHAR(1))
RETURNS @OutputTable TABLE (Item VARCHAR(1000))
AS
BEGIN
DECLARE @Start INT, @End INT
SET @Start = 1
IF SUBSTRING(@InputString, LEN(@InputString) - 1, LEN(@InputString)) <> @Delimiter
BEGIN
SET @InputString = @InputString + @Delimiter
END
WHILE CHARINDEX(@Delimiter, @InputString, @Start) > 0
BEGIN
SET @End = CHARINDEX(@Delimiter, @InputString, @Start)
INSERT INTO @OutputTable(Item)
VALUES(SUBSTRING(@InputString, @Start, @End - @Start))
SET @Start = @End + 1
END
RETURN
END
通过上述函数,可以轻松地将一个字符串分割成多个部分,并将其存储在表中。例如,执行以下查询:
SELECT * FROM dbo.SplitString('1,2,3,4,5,6,7', ',')
将返回如下结果:
Item
----
1
2
3
4
5
6
7
另一方面,有时我们也需要将多行数据合并成一行。例如,有一个表 `tb`,其中包含两列 `id` 和 `data`,我们希望按 `id` 分组,将每个 `id` 对应的所有 `data` 值合并成一个字符串。这可以通过以下SQL语句实现:
CREATE TABLE tb (id INT, data VARCHAR(10));
INSERT INTO tb VALUES (1, 'a'), (1, 'b'), (1, 'c'), (2, 'aa'), (2, 'bb');
SELECT id,
[data] = STUFF((SELECT ',' + data FROM tb t WHERE t.id = tb.id FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM tb
GROUP BY id;
该查询的结果将是:
id data
-- -----
1 abc
2 aabb
这种方法利用了 `FOR XML PATH` 的特性,通过 `STUFF` 函数去除多余的前导字符,最终实现了多行字符串的合并。