sscanf)。sprintf),避免大量 + 串接與引號巢狀。兩者皆為未文件化擴展程序,生產環境請評估相容性風險。
CREATE FUNCTION dbo.f_getip(@ip VARCHAR(100))
RETURNS @t TABLE (a INT, b INT, c INT, d INT)
AS
BEGIN
SET @ip = REPLACE(@ip, '.', ' ');
DECLARE @s1 VARCHAR(3), @s2 VARCHAR(3), @s3 VARCHAR(3), @s4 VARCHAR(3);
EXEC xp_sscanf @ip, '%s %s %s %s', @s1 OUTPUT, @s2 OUTPUT, @s3 OUTPUT, @s4 OUTPUT;
INSERT INTO @t SELECT @s1, @s2, @s3, @s4;
RETURN;
END;
SELECT * FROM dbo.f_getip('192.168.0.1');
-- 結果:192, 168, 0, 1
CREATE PROC p_select
@tb VARCHAR(100), @cols VARCHAR(100), @wherecol VARCHAR(100), @value VARCHAR(100)
AS
BEGIN
DECLARE @s VARCHAR(8000);
EXEC xp_sprintf @s OUTPUT, 'SELECT %s FROM %s WHERE %s=''%s''', @cols, @tb, @wherecol, @value;
EXEC(@s);
END;
EXEC p_select 'sysobjects', 'id, xtype, crdate', 'name', 'p_select';
| 優點 | 缺點/風險 |
|---|---|
| 程式碼簡潔、可讀性高 | 未文件化,版本升級可能移除 |
| 避免複雜引號巢狀 | 格式字串長度限制 8000 字元 |
| 效能優於大量字串串接 | 注入風險:參數若來自使用者輸入需嚴格驗證 |
STRING_AGG、CONCAT_WS、FORMAT。sp_executesql:最安全、計畫可重用。了解 xp_sscanf/xp_sprintf 有助維護舊系統,新專案建議採用原生函數或 CLR。