2014-07-17 153 views
0

我正試圖編寫一個動態的T-SQL查詢並運行到錯誤中。動態TSQL查詢

我已經刪除了除單個var之外的所有內容,並且在嘗試運行查詢時仍然收到錯誤消息。

ALTER PROCEDURE [dbo].[empowermentFetchSubmissions2] 
@category INT=NULL 
AS 
DECLARE @sSQL AS NVARCHAR (3000), 
@Where AS NVARCHAR (1000) = ''; 
BEGIN 
    SET NOCOUNT ON; 
    BEGIN 
     SET @sSQL = 'SELECT A.[submissionID], 
          A.[subEmpID], 
          A.[nomineeEmpID], 
          CONVERT (VARCHAR (10), A.[submissionDate], 101) AS submissionDate, 
          A.[situation], 
          A.[task], 
          A.[action], 
          A.[result], 
          A.[timestamp], 
          A.[statusID], 
          A.[approver], 
          A.[approvalDate], 
          B.[FirstName] + " " + B.[LastName] AS nomineeName, 
          B.[ntid] AS nomineeNTID, 
          B.[qid] AS nomineeQID, 
          C.[FirstName] + " " + C.[LastName] AS submitName, 
          C.[ntid] AS submitNTID, 
          D.[categoryName] 
        FROM  empowermentSubmissions AS A 
          INNER JOIN 
          empTable AS B 
          ON A.[nomineeEmpID] = B.[empID] 
          INNER JOIN 
          empTable AS C 
          ON A.[subEmpID] = C.[empID] 
          INNER JOIN 
          empowermentCategories AS D 
          ON A.[categoryID] = D.[catID]'; 
     IF (@category) IS NOT NULL 
      SET @Where = @Where + ' AND A.[categoryID] = @_category'; 
     IF LEN(@Where) > 0 
      SET @sSQL = @sSQL + 'WHERE ' + RIGHT(@Where, LEN(@Where) - 3); 
     EXECUTE sp_executesql @sSQL, N'@_category', @_category = @category; 
    END 
END 

錯誤運行,這是當我得到:

附近有語法錯誤)「。消息4145,等級15,狀態1,行28 表示在預計接近'A'的條件下的上下文中指定的非布爾類型。

有什麼明顯的,我在這裏做錯了嗎?

+0

那些雙引號或兩個單引號中的nomineeName和submitName字段?他們應該是兩個單引號。 –

+0

他們是雙引號環繞'SET'的單引號和不喜歡當那些是單一的.. – SBB

+0

我改變了像這樣B.' [FirstName] +''''+ B. [LastName] AS nomineeName,''並得到相同的錯誤 – SBB

回答

0

我已將您的代碼修改爲我認爲可行的點。我發現了3個問題,通過評論你的執行線並在其之前放置一個print @ssql。然後執行存儲過程。第一個問題是報價。我將它們改爲單引號。接下來是WHERE的新行,它與ON位於同一行。最後的問題是你沒有足夠的修剪掉WHERE的,它留下的字母D

ALTER PROCEDURE [dbo].[empowermentFetchSubmissions2] 
@category INT=NULL 
AS 
DECLARE @sSQL AS NVARCHAR (3000), 
@Where AS NVARCHAR (1000) = ''; 
BEGIN 
    SET NOCOUNT ON; 
    BEGIN 
     SET @sSQL = 'SELECT A.[submissionID], 
          A.[subEmpID], 
          A.[nomineeEmpID], 
          CONVERT (VARCHAR (10), A.[submissionDate], 101) AS submissionDate, 
          A.[situation], 
          A.[task], 
          A.[action], 
          A.[result], 
          A.[timestamp], 
          A.[statusID], 
          A.[approver], 
          A.[approvalDate], 
          B.[FirstName] + '' '' + B.[LastName] AS nomineeName, 
          B.[ntid] AS nomineeNTID, 
          B.[qid] AS nomineeQID, 
          C.[FirstName] + '' '' + C.[LastName] AS submitName, 
          C.[ntid] AS submitNTID, 
          D.[categoryName] 
        FROM  empowermentSubmissions AS A 
          INNER JOIN 
          empTable AS B 
          ON A.[nomineeEmpID] = B.[empID] 
          INNER JOIN 
          empTable AS C 
          ON A.[subEmpID] = C.[empID] 
          INNER JOIN 
          empowermentCategories AS D 
          ON A.[categoryID] = D.[catID]'; 
     IF (@category) IS NOT NULL 
      SET @Where = @Where + ' AND A.[categoryID] = @_category'; 
     IF LEN(@Where) > 0 
      SET @sSQL = @sSQL + ' 
      WHERE ' + RIGHT(@Where, LEN(@Where) - 4); 
     EXECUTE sp_executesql @sSQL, N'@_category', @_category = @category; 
    END 
END 

這裏是你的代碼最初打印,如果你想看到的問題。

SELECT A.[submissionID], 
          A.[subEmpID], 
          A.[nomineeEmpID], 
          CONVERT (VARCHAR (10), A.[submissionDate], 101) AS submissionDate, 
          A.[situation], 
          A.[task], 
          A.[action], 
          A.[result], 
          A.[timestamp], 
          A.[statusID], 
          A.[approver], 
          A.[approvalDate], 
          B.[FirstName] + " " + B.[LastName] AS nomineeName, 
          B.[ntid] AS nomineeNTID, 
          B.[qid] AS nomineeQID, 
          C.[FirstName] + " " + C.[LastName] AS submitName, 
          C.[ntid] AS submitNTID, 
          D.[categoryName] 
        FROM  empowermentSubmissions AS A 
          INNER JOIN 
          empTable AS B 
          ON A.[nomineeEmpID] = B.[empID] 
          INNER JOIN 
          empTable AS C 
          ON A.[subEmpID] = C.[empID] 
          INNER JOIN 
          empowermentCategories AS D 
          ON A.[categoryID] = D.[catID]WHERE D A.[categoryID] = @_category 
0

您需要將雙引號更改爲兩個單引號:

B.[FirstName] + '' '' + B.[LastName] AS nomineeName, 
C.[FirstName] + '' '' + C.[LastName] AS submitName, 

編輯: 還需要在前面的空間,在這條線:

SET @sSQL = @sSQL + ' WHERE ' + RIGHT(@Where, LEN(@Where) - 3); 
0

我想你」如果你想把'AND'關掉,就不要從你的@Where變量開始剝離足夠的字符。這是5個字符,而不是三個。

在任何情況下,這是沒有必要的,因爲在WHERE子句中只會有一個條件(所以你可以在第一個地方放棄AND,而不是放入然後再將其除去),但我想你打算讓這變得更加複雜?

+0

是的,它會有更多的片斷,但需要先處理它1 – SBB

0

順便問一下,你也可以做

@Where AS NVARCHAR (1000) = ' (1=1) '; 

然後,你可以添加任意數量的「AND ......」你喜歡不進一步的字符串處理。

+0

你是什麼意思「進一步字符串處理「? – SBB

+0

我只是說你可以使用'@ Where'而不是'RIGHT(@Where,LEN(@Where)-3)'。錯誤機會少一個。 – JimmyB