首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 相同 ID 合併欄位值:自訂函數與臨時表實作範例

     編輯:關於SqlServer

需求:將相同 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');

方法一:自訂純量函數 (Scalar UDF)

建立函數接受代碼參數,回傳合併字串:

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;

結果:

CodeMergedTxt
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。
  • 臨時表: 適合複雜多步驟 ETL 中繼存儲,減少鎖定主表時間。
  • 現代寫法: SELECT Code, STRING_AGG(Txt, ',') FROM DemoTable GROUP BY Code; (SQL Server 2017+)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved