首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL Server 預存程序字串比較失敗:char 與 varchar 差異導致查詢結果為 0

     編輯:程式設計綜合問答

預存程序執行無誤,但查詢結果永遠返回 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' (無尾部空格),導致 = 比較失敗。

解決方案

  1. 統一改用 varchar (推薦):
    ALTER TABLE Users ALTER COLUMN UserCode varchar(10);
    ALTER PROC GetUser @Code varchar(10) AS ...
    
  2. 或在比較時 RTRIM 移除尾部空格:
    WHERE RTRIM(UserCode) = RTRIM(@Code)
    
  3. 或參數宣告為 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 後,預存程序正常返回預期資料。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved