2011-10-08 36 views
0

我想寫一個動態sql.following是我的存儲過程,它的具有附加的SQL查詢來@SQLSTATEMENT能有人幫我解決這個錯誤?它顯示+標記問題和Sql動態查詢

EX下錯誤 - SET @SQLSTATEMENT +'AND TA.AreaID='[email protected]+'

ALTER PROCEDURE spGetOverDueDocuments 
@AreaID INT =NULL, 
@DepartmentID INT= NULL, 
@ABSID INT =NULL, 
@DisciplineID INT = NULL, 
@CPOID INT = NULL, 
@DocumentTypeID INT = NULL, 
@DueType VaRCHAR(20) = NULL 
AS 
BEGIN 
DECLARE @SQLSTATEMENT VARCHAR(MAX) 


SELECT @SQLSTATEMENT = 'SELECT * '+ 
'FROM tblActionHeader AH INNER JOIN '+ 
'tblDocumentRevisionActionHeader DAH ON AH.ActionHeaderID=DAH.ActionHeaderID INNER JOIN '+ 
'tblDocumentRevision DR ON DAH.DocumentRevisionID=DR.DocumentRevisionID INNER JOIN '+ 
'tblDocumentHeader DH ON DR.DocumentHeaderID=DH.DocumentHeaderID INNER JOIN tblABS TB ON DH.ABSID=TB.ABSID ' + 
'INNER JOIN tblArea TA ON TA.AreaID=TB.AreaNo INNER JOIN tblContractPODocumentHeader CDH ON '+ 
' CDH.DocumentHeaderID=DH.DocumentHeaderID INNER JOIN tblDiscipline DC ON '+ 
' DH.DisciplineID=DC.DisciplineID INNER JOIN tblContractPO CPO ON CPO.CPOID=DH.CPOID INNER JOIN tblDocumentType DT '+ 
' ON DT.DocumentTypeID=DH.DocumentTypeID '+ 
'WHERE AH.ActionTypeID=4 ' 
IF @AreaID<>'0' 
BEGIN 
SET @SQLSTATEMENT + ' AND TA.AreaID='[email protected]+' ' 
END 

IF @ABSID<>'0' 
BEGIN 
SET @SQLSTATEMENT + ' AND TB.ABSID='[email protected]+' ' 
END 

IF @DisciplineID<>'0' 
BEGIN 
SET @SQLSTATEMENT + ' AND DC.DisciplineID='[email protected]+' ' 
END 

IF @CPOID<>'0' 
BEGIN 
SET @SQLSTATEMENT + ' AND CPO.CPOID='[email protected]+' ' 
END 

IF @DocumentTypeID<>'0' 
BEGIN 
SET @SQLSTATEMENT + ' AND DT.DocumentTypeID='[email protected]+' ' 
END 

EXEC(@SQLSTATEMENT) 

END 

回答

2

嘗試

SET @SQLSTATEMENT = @SQLSTATEMENT + <rest> 

SET @SQLSTATEMENT = @SQLSTATEMENT + ' AND TA.AreaID='+STR(@AreaID)+' ' 
+0

thanx it works .. – chamara

2

@Area ID被聲明爲INT,你需要將其轉換爲varchar爲了能夠將其追加。

試試這個:

SET @SQLSTATEMENT + ' AND TA.AreaID='+cast(@AreaID as varchar(30))+' ' 
+0

thanx it works .. – chamara

0

另一種選擇是使用不需要動態SQL查詢

一種可能的方式做到這一點是:

SELECT * 
FROM tblActionHeader AH 
INNER JOIN tblDocumentRevisionActionHeader DAH ON AH.ActionHeaderID=DAH.ActionHeaderID 
INNER JOIN tblDocumentRevision DR ON DAH.DocumentRevisionID=DR.DocumentRevisionID 
INNER JOIN tblDocumentHeader DH ON DR.DocumentHeaderID=DH.DocumentHeaderID 
INNER JOIN tblABS TB ON DH.ABSID=TB.ABSID 
INNER JOIN tblArea TA ON TA.AreaID=TB.AreaNo 
INNER JOIN tblContractPODocumentHeader CDH ON CDH.DocumentHeaderID=DH.DocumentHeaderID 
INNER JOIN tblDiscipline DC ON DH.DisciplineID=DC.DisciplineID 
INNER JOIN tblContractPO CPO ON CPO.CPOID=DH.CPOID 
INNER JOIN tblDocumentType DT ON DT.DocumentTypeID=DH.DocumentTypeID 
WHERE TA.AreaID = (CASE WHEN @AreaID<>'0' THEN @AreaID ELSE TA.AreaId END) 
AND TA.ABSID = (CASE WHEN @ABSID<>'0' THEN @ABSID ELSE TA.ABSID END) 
AND DC.DisciplineID = (CASE WHEN @DisciplineID<>'0' THEN @DisciplineID ELSE DC.DisciplineID END) 
AND CPO.CPOID = (CASE WHEN @CPOID<>'0' THEN @CPOID ELSE TA.ABSID END) 
AND DT.DocumentTypeID = (CASE WHEN @DocumentTypeID<>'0' THEN @DocumentTypeID ELSE TA.ABSID END) 

在此查詢中,您動態添加的搜索謂詞現在設置爲與自己進行比較,除非指定了另一個值。只要它們中的任何一個都爲null(因爲測試NULL = NULL或NULL = x將始終爲假),這將工作。

這很可能導致更好的查詢可以被緩存和重用。但需要注意的一點是參數嗅探:如果您在所有參數= 0的情況下首次運行此SP,則優化器將選擇(並緩存)一個非常不同的執行計劃,而不是大多數參數都不爲零。