需求:將相同 code 的多筆 txt 值合併為單一字串,以逗號分隔。本文示範使用自訂純量函數與臨時表兩種作法。
CREATE TABLE DemoTable (
ID INT PRIMARY KEY IDENTITY(1,1),
Code VARCHAR(32),
Txt VARCHAR(64)
);
INSERT INTO DemoTable (Code, Txt) VALUES
('102','科學'), ('102','數學'), ('102','數學1'),
('101','美術'), ('101','體育'), ('101','體育1');
建立函數接受代碼參數,回傳合併字串:
CREATE FUNCTION dbo.ConcatTxtByCode (@Code VARCHAR(20))
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @Result VARCHAR(1000) = '';
SELECT @Result = @Result + ',' + Txt FROM DemoTable WHERE Code = @Code;
SET @Result = STUFF(@Result, 1, 1, ''); -- 移除首個逗號
RETURN @Result;
END;
GO
-- 查詢:每個代碼一行,欄位為合併字串
SELECT Code, dbo.ConcatTxtByCode(Code) AS MergedTxt
FROM DemoTable
GROUP BY Code;
結果:
| Code | MergedTxt |
|---|---|
| 101 | 美術,體育,體育1 |
| 102 | 科學,數學,數學1 |
臨時表分區域暫存表(#Table)與全域暫存表(##Table),連線中斷自動清除。
CREATE TABLE #TempCopy (
ID INT,
Name VARCHAR(50)
);
INSERT INTO #TempCopy (ID, Name) VALUES (1, '123');
SELECT * FROM #TempCopy;
DROP TABLE #TempCopy; -- 明確刪除,或等連線結束自動清除
USE MyDB;
SELECT * INTO #Temp FROM tb_Student; -- 複製結構與數據到區域暫存表
SELECT * INTO tb_Lizi FROM #Temp; -- 從暫存表建立永久表
-- 斷線重連後,#Temp 自動消失,tb_Lizi 保留數據
STRING_AGG (SQL 2017+) 或 FOR XML PATH。SELECT Code, STRING_AGG(Txt, ',') FROM DemoTable GROUP BY Code; (SQL Server 2017+)