函數分類與選型
- 純量函數:回傳單一值
- 資料表值函數:回傳 Table 型別資料集
- 內嵌:單一 SELECT 陳述句
- 多陳述式:多個 SELECT 組成(本例採用)
多陳述式資料表值函數語法架構
CREATE FUNCTION function_name
(@parameter_name datatype)
RETURNS @return_variable TABLE (column_definitions)
AS
BEGIN
function_body
RETURN
END
實作程式碼:tablestructure 函數
CREATE FUNCTION tablestructure
(@objname NVARCHAR(111)) -- 目標資料表名稱
RETURNS @table TABLE (
FieldName VARCHAR(50), -- 欄位名稱
Type VARCHAR(16), -- 資料型別
Length INT, -- 長度
Nullable VARCHAR(3) -- 是否允許 NULL (yes/no)
)
AS
BEGIN
DECLARE @objid INT
-- 1. 從 sysobjects 取得物件識別碼
SELECT @objid = id FROM sysobjects WHERE id = OBJECT_ID(@objname)
-- 2. 從 syscolumns 取得欄位定義(排除程序參數 number=0)
INSERT @table
SELECT
'FieldName' = name,
'Type' = TYPE_NAME(xusertype),
'Length' = CONVERT(INT, length),
'Nullable' = CASE WHEN isnullable = 0 THEN 'no' ELSE 'yes' END
FROM syscolumns
WHERE id = @objid AND number = 0
ORDER BY colid
RETURN
END
系統表說明
- sysobjects:資料庫中每個物件(條件約束、預設值、規則、預存程序等)佔一列
- syscolumns:每個資料表與檢視表的每個資料行佔一列
呼叫範例
SELECT * FROM tablestructure('YourTableName')