預存程序執行無誤,但查詢結果永遠返回 0。經排查,原因是表欄位與參數使用 char 固定長度類型,導致比較時尾部空格不匹配。
CREATE TABLE Users (
UserCode char(10) PRIMARY KEY, -- 固定長度
UserName varchar(50)
);
CREATE PROC GetUser @Code char(10) AS
SELECT * FROM Users WHERE UserCode = @Code; -- 隱性轉換陷阱
呼叫 EXEC GetUser 'A001' 時,@Code 實際值為 'A001 ' (補 6 空格),而表中儲存可能為 'A001' (無尾部空格),導致 = 比較失敗。
varchar (推薦):
ALTER TABLE Users ALTER COLUMN UserCode varchar(10);
ALTER PROC GetUser @Code varchar(10) AS ...
WHERE RTRIM(UserCode) = RTRIM(@Code)
varchar,表欄位保持 char,SQL Server 會自動截斷尾部空格比較。varchar(n) 或 nvarchar(n),除非極少數固定長度場景 (如 MD5 雜湊、郵遞區號)。WHERE varchar_col = char_param 會導致索引失效。DECLARE @c char(10) = 'A001';
DECLARE @v varchar(10) = 'A001';
SELECT CASE WHEN @c = @v THEN 'Equal' ELSE 'Not Equal' END; -- 輸出 Not Equal
SELECT CASE WHEN RTRIM(@c) = @v THEN 'Equal' ELSE 'Not Equal' END; -- 輸出 Equal
將 char 改為 varchar 後,預存程序正常返回預期資料。