2010-06-23 135 views
1

我在嘗試創建相當簡單的動態SQL查詢時遇到了問題。當我PRINT @SQLString時,變量不顯示它們包含的值。有任何想法嗎?編寫動態SQL查詢

ALTER PROCEDURE [dbo].[usp_ItemSearch] 
    @ItemNum varchar(30) = NULL 
    ,@SearchFilter int 
    ,@VendorNum varchar(10) = NULL 
    ,@RecUserID int = NULL 
    ,@StartDate smalldatetime = NULL 
    ,@EndDate smalldatetime = NULL 
AS 
DECLARE @SQLString as varchar(1000) 

SET @SQLString = 'SELECT RecID, VendorNum, VendorName, PORelNum, InvoiceNum, ItemNum, RecAddDate, LastUpdated FROM tbl_Processor_ItemDscLog' 

IF @ItemNum IS NOT NULL 
    BEGIN 
     IF @SearchFilter = 2 
      BEGIN 
       SET @SQLString = @SQLString + ' WHERE ItemNum LIKE ''%' + @ItemNum + '''' --Ends with 
      END 
     IF @SearchFilter = 1 
      BEGIN 
       SET @SQLString = @SQLString + ' WHERE ItemNum LIKE ''%' + @ItemNum + '%''' --Contains 
      END 
     IF @SearchFilter = 0 
      BEGIN 
       SET @SQLString = @SQLString + ' WHERE ItemNum LIKE ''' + @ItemNum + '%''' --Starts with 
      END 
    END 

IF @VendorNum IS NOT NULL 
    BEGIN 
     SET @SQLString = @SQLString + ' WHERE VendorNum = ''' + @VendorNum + '''' 
    END 

IF @RecSearchUserID IS NOT NULL 
    BEGIN 
     SET @SQLString = @SQLString + ' AND (RecAddUserID = @RecUserID)' 
    END 

IF (@EndDate IS NOT NULL) 
    BEGIN 
     IF (@StartDate IS NOT NULL) 
      BEGIN 
       SET @SQLString = @SQLString + ' WHERE RecAddDate between @StartDate AND @EndDate ' 
      END 
     ELSE 
      BEGIN 
       SET @SQLString = @SQLString + ' RecAddDate BETWEEN 01/01/1996 AND @EndDate + ' 
      END 
    END 

SET @SQLString = @SQLString + ' ORDER BY ItemNum, VendorNum' 
PRINT @SQLString 
+0

您的'PRINT @ SQLString'在存儲過程中嗎? (我看不到它) – 2010-06-23 03:01:02

+0

是的。我剛編輯了代碼。感謝那。 – Frank 2010-06-23 03:03:49

+0

爲什麼要避免在T-SQL中執行動態SQL有充分的理由。例如,如果'@ ItemNum'是'O'Malley',會發生什麼?一般來說,不要這樣做動態SQL。作爲參數化查詢在中間層組件中執行。 – Thomas 2010-06-23 03:04:15

回答

3

您正在向@SQLString中正確添加@ItemNum和@VendorNum,但未正確添加其他3個變量。你必須將它們轉換爲varchar,並將它們連接到@SQLString,就像你在做其他的一樣。

例如,這裏的@RecSearchUserID塊應該是什麼樣子:

IF @RecSearchUserID IS NOT NULL 
    BEGIN 
     SET @SQLString = @SQLString + ' AND (RecAddUserID = ' + CAST(@RecUserID AS VarChar) + ')' 
    END 

另外,你千萬要小心,包含撇號的輸入變量爲其他評論者,以防止SQL人士指出注入...