CREATE TYPE SourceKeyList AS TABLE (SourceKey NVARCHAR(50));
-- 查詢現有表類型
SELECT name, system_type_id, user_type_id FROM sys.types WHERE is_table_type = 1;
CREATE TABLE dbo.dim_Customer (
sk_Customer INT IDENTITY NOT NULL,
CustomerSourceKey NVARCHAR(50) NOT NULL,
CustomerName NVARCHAR(50) NOT NULL,
InferredMember BIT NOT NULL
);
CREATE PROCEDURE dbo.stp_GetCustomerSK
@source_key_list SourceKeyList READONLY
AS
BEGIN
-- 插入推斷成員 (來源鍵不存在時)
INSERT INTO dbo.dim_Customer (CustomerSourceKey, CustomerName, InferredMember)
SELECT SourceKey, N'INFERRED', 1
FROM @source_key_list k
LEFT JOIN dbo.dim_Customer c ON c.CustomerSourceKey = k.SourceKey
WHERE sk_Customer IS NULL;
-- 回傳代理鍵對應
SELECT sk_Customer, CustomerSourceKey
FROM dbo.dim_Customer c
JOIN @source_key_list k ON k.SourceKey = c.CustomerSourceKey;
END;
TVP 必須 READONLY,不可執行 DML,僅能於 SELECT 參考。可查詢 sys.parameters WHERE is_readonly = 1 驗證。
DECLARE @source_key_list SourceKeyList;
INSERT INTO @source_key_list SELECT 'CustomerID_001' UNION ALL SELECT 'CustomerID_002' UNION ALL SELECT 'CustomerID_003';
EXEC dbo.stp_GetCustomerSK @source_key_list;
實際應用中可從來源系統 SELECT DISTINCT 取得鍵值清單。結果回傳每個來源鍵對應代理鍵。
TVP 為資料倉庫 ETL 代理鍵查找提供高效、原生的集合傳遞機制,簡化開發並提升效能。