READONLY 子句。預存程序內部無法修改 表值參數的資料內容(不可 INSERT/UPDATE/DELETE),僅能讀取用於查詢、連接、篩選等操作。OUTPUT,只能作為 INPUT 參數傳入。若需回傳資料集,請改用結果集、游標或暫存表。建立類型一次,多處重用,避免重複定義結構:
-- 1. 建立使用者定義資料表類型 (僅需執行一次)
CREATE TYPE SalesHistoryTableType AS TABLE
(
ProductID INT,
SaleDate DATE,
Quantity INT,
UnitPrice MONEY
);
GO
-- 2. 宣告變數並填入資料
DECLARE @DataTable AS SalesHistoryTableType;
DECLARE @i SMALLINT = 1;
WHILE (@i <= 1000)
BEGIN
INSERT INTO @DataTable (ProductID, SaleDate, Quantity, UnitPrice)
VALUES (@i, DATEADD(DAY, -@i, GETDATE()), @i % 10 + 1, RAND() * 100 + 10);
SET @i = @i + 1;
END
-- 3. 傳遞給預存程序
EXEC usp_ProcessSalesHistory @SalesData = @DataTable;
CREATE PROCEDURE usp_ProcessSalesHistory
@SalesData SalesHistoryTableType READONLY -- 必須加 READONLY
AS
BEGIN
-- 只能讀取,不可修改 @SalesData
SELECT ProductID, SUM(Quantity * UnitPrice) AS TotalSales
FROM @SalesData
GROUP BY ProductID
ORDER BY TotalSales DESC;
END
MERGE 陳述式實現高效 UPSERT 批次操作。