# Stored Procedure 傳入參數的雷 ( 限制長度過短,傳入的變數字串會自動截斷 ) ###### tags: `SQL` ## Script ``` ALTER PROCEDURE [dbo].[spGetNewQuestionCode] @CategoryCode varchar(2), @SubjectCode varchar(3), @SkillRuleCode varchar(2) AS Declare @ErrorMessage nvarchar(max) = N'' -- validate parameters. IF LEN(@CategoryCode) > 2 BEGIN SET @ErrorMessage = @ErrorMessage + N'類別代碼只能傳入 2 碼。' END IF LEN(@SubjectCode) > 3 BEGIN SET @ErrorMessage = @ErrorMessage + N'科目代碼只能傳入 3 碼。' END IF LEN(@SkillRuleCode) > 2 BEGIN SET @ErrorMessage = @ErrorMessage + N'技能規範代碼只能傳入 2 碼。' END IF LEN(@ErrorMessage) > 0 BEGIN RAISERROR(@ErrorMessage,16,1) RETURN END BEGIN -- Do Something.... END ``` ## 執行 ``` Exec [spGetNewQuestionCode] @CategoryCode = 'AB', @SubjectCode = 'CDEFG', @SkillRuleCode = '01' ``` ## 發生何事 @SubjectCode 明明傳入 'CDEFG',卻沒有檢查出「科目代碼只能傳入 3 碼。」的錯誤! ### 讓我們在檢查前 PRINT @SubjectCode 出來看看 ``` PRINT @SubjectCode ``` ### 結果 ![](https://i.imgur.com/YxYMTFP.png) **What The Fork…** 他自己截斷了後面的 FG... ## 解 將變數設為 nvarchar(max) 再好好檢查吧!設成 char(3) 是沒有用的