標籤:des style blog http color io 使用 ar strong
在SQL Server資料庫中書寫複雜的預存程序時,一般的做法是拼接字串,最後使用EXEC sp_executesql ‘拼接的字串‘ 查詢出結果。
先看一段代碼:
1 -- ============================================= 2 -- Author: XXX 3 -- Create date: 2014-09-19 4 -- Description: 擷取學生列表資訊 5 -- ============================================= 6 ALTER PROCEDURE [dbo].[Sp_GetStudentList] 7 @StudentId INT --主鍵id 8 AS 9 BEGIN10 11 SET NOCOUNT ON;12 13 DECLARE @SqlSelectResult NVARCHAR(MAX) = ‘‘; 14 SET @SqlSelectResult = ‘SELECT * FROM Student AS s ‘;15 16 IF (ISNULL(@StudentId, 0) > 0)17 BEGIN18 SET @SqlSelectResult = @SqlSelectResult + ‘ WHERE s.ClassId > ‘ + @StudentId;19 END20 21 PRINT (@SqlSelectResult);22 23 EXEC sp_executesql @SqlSelectResult;24 25 SET NOCOUNT OFF;26 END
然後調用該預存程序:EXEC Sp_GetStudentList 1。結果如下:
運行失敗。
仔細分析原因發現:預存程序參數@StudentId 類型為INT(整形)型;而自訂變數@SqlSelectResult是NVARCHAR(MAX)字串類型。
在23行,EXEC sp_executesql @SqlSelectResult;執行拼接字串時,報錯,編譯器嘗試將字串類型轉換成int類型失敗。
意思是:SQL Server中在拼接字串時,所有的變數必須全部是字串類型,才能正確拼接,否則報錯。
解決方案1:將非字串類型的變數轉換為字串類型,
將18行代碼修改為:
SET @SqlSelectResult = @SqlSelectResult + ‘ WHERE s.ClassId > ‘ + convert(nvarchar(10),@StudentId);
解決方案2:在預存程序開始定義的時候,將參數定義為字串類型
ALTER PROCEDURE [dbo].[Sp_GetStudentList] @StudentId INT --主鍵id AS
……
SQL Server資料庫預存程序中拼接字串注意的問題