我正在处理一个返回下面显示的项目列表的查询:
SELECT ID, Description FROM TableA WHERE ID = 10001
返回:
ID Description
10001 Item1 Item2 Item3 Item4
但是,我想要的是能够返回多行。
ID Description
10001 Item1
10001 Item2
10001 Item3
10001 Item4
有没有简单的方法来实现这一目标?
谢谢!
答案 0 :(得分:4)
以下是如何执行此操作的方法:
SELECT id,
Split.a.value('.', 'VARCHAR(100)') AS String
FROM (SELECT id, CAST ('<M>' + REPLACE(description, ' ', '</M><M>') + '</M>' AS XML) AS n from TableA where id = 1001) AS A
CROSS APPLY n.nodes ('/M') AS Split(a);
答案 1 :(得分:1)
你也可以创建一个这样做的功能
CREATE FUNCTION [dbo].[RowToManyRows] ( @StringInput VARCHAR(8000) )
RETURNS @OutputTable TABLE ( [String] VARCHAR(10) )
AS
BEGIN
DECLARE @String VARCHAR(10)
WHILE LEN(@StringInput) > 0
BEGIN
SET @String = LEFT(@StringInput,
ISNULL(NULLIF(CHARINDEX(' ', @StringInput) - 1, -1),
LEN(@StringInput)))
SET @StringInput = SUBSTRING(@StringInput,
ISNULL(NULLIF(CHARINDEX(' ', @StringInput), 0),
LEN(@StringInput)) + 1, LEN(@StringInput))
INSERT INTO @OutputTable ( [String] )
VALUES ( @String )
END
RETURN
END
GO
然后您可以查询该功能
SELECT ID, String
FROM myTable CROSS APPLY [dbo].RowToManyRows(myTable.Description)
示例:
CREATE TABLE myTable
( ID INT,
Description VARCHAR(50)
)
INSERT INTO dbo.myTable
( ID, Description )
VALUES ( 1, -- ID - int
'A B' -- Description - varchar(50)
),
(2,
'C D')
结果
1 A
1 B
2 C
2 D