假設我們有一個簡單的查詢是這樣的:如何使用逗號之間的T-SQL結果列表?
SELECT x
FROM t
WHERE t.y = z
如果我們在結果集中的一個記錄,我想變@v
設置爲一個值。如果我們有兩個或更多記錄,我希望結果用逗號和空格分隔。編寫這個T-SQL代碼的最好方法是什麼?
實施例:
結果集的1結果:
結果集的2個記錄:
Value1, Value2
結果集的3個記錄:
Value1, Value2, Value3
假設我們有一個簡單的查詢是這樣的:如何使用逗號之間的T-SQL結果列表?
SELECT x
FROM t
WHERE t.y = z
如果我們在結果集中的一個記錄,我想變@v
設置爲一個值。如果我們有兩個或更多記錄,我希望結果用逗號和空格分隔。編寫這個T-SQL代碼的最好方法是什麼?
實施例:
結果集的1結果:
結果集的2個記錄:
Value1, Value2
結果集的3個記錄:
Value1, Value2, Value3
這會給你一個逗號值的列表分隔列表
create table #temp
(
y int,
x varchar(10)
)
insert into #temp values (1, 'value 1')
insert into #temp values (1, 'value 2')
insert into #temp values (1, 'value 3')
insert into #temp values (1, 'value 4')
DECLARE @listStr varchar(255)
SELECT @listStr = COALESCE(@listStr+', ', '') + x
FROM #temp
WHERE #temp.y = 1
SELECT @listStr as List
drop table #temp
您可以使用XML來做到這一點:
DECLARE @V VarChar(4000);
SELECT @V = CONVERT(VarChar(4000), (
SELECT x + ', '
FROM t
WHERE t.y = z
FOR XML PATH('')
));
-- To remove the final , in the list:
SELECT @V = LEFT(@V, LEN(@V) - 2);
SELECT @V;
如何像這樣???
DECLARE @x AS VARCHAR(2000)
SET @x = ''
SELECT @x = @x + RTRIM(x) + ','
FROM t
SELECT @x = SUBSTRING(@x, 1, LEN(@x) - 1)
PRINT @x
因爲它是SQL Server 2008中,您可以用FOR XML:
SELECT SUBSTRING(
(SELECT ',' + t.x
FROM t
WHERE t.y = z
FOR XML PATH('')),
2,
200000) AS CSV
FOR XML PATH( '')選擇表作爲XML,而是一個空白路徑。 子串(選擇,2個,200萬)去除領先「」
你可以使用遞歸CTE爲這樣:
CREATE TABLE #TableWithId (Id INT IDENTITY(1,1), x VARCHAR)
INSERT INTO #TableWithId
SELECT x
FROM t
WHERE t.y = z
WITH Commas(ID, Flattened)
AS
(
-- Anchor member definition
SELECT ID, x AS Flattened
FROM #TableWithId
WHERE ID = 1
UNION ALL
-- Recursive member definition
SELECT #TableWithId.Id, Flattened + ',' + x
FROM #TableWithId
INNER JOIN Commas
ON #TableWithId.Id + 1 = Commas.Id
)
-- Statement that executes the CTE
SELECT TOP 1 Flattened
FROM Commas
ORDER BY id;
GO
'什麼是最好的辦法'‘最佳’是主觀的..取決於你在找什麼東西。你可以說得更詳細點嗎?它是否需要完全在T-SQL中完成,還是可以在客戶端上使用解決方案? – 2012-03-15 19:22:07
這是否適用? http://stackoverflow.com/questions/1048209/concatenating-column-values-into-a-comma-separated-list – MatthewMartin 2012-03-15 19:23:21
我只是想爲此寫一個泛型函數..通常我在.NET中處理這些代碼後,我已經得到了結果,但我想這樣做在SQL – MacGyver 2012-03-15 19:23:57