[英]Issue with Sql Dynamic Query
我正在嘗試編寫動態sql。以下是我的存儲過程,將sql查詢附加到@SQLSTATEMENT時出錯,有人可以幫助我解決這個問題嗎? 它在+標記下顯示錯誤
EX-設置@SQLSTATEMENT + 'AND TA.AreaID='+@AreaID+''
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='+@AreaID+' '
END
IF @ABSID<>'0'
BEGIN
SET @SQLSTATEMENT + ' AND TB.ABSID='+@ABSID+' '
END
IF @DisciplineID<>'0'
BEGIN
SET @SQLSTATEMENT + ' AND DC.DisciplineID='+@DisciplineID+' '
END
IF @CPOID<>'0'
BEGIN
SET @SQLSTATEMENT + ' AND CPO.CPOID='+@CPOID+' '
END
IF @DocumentTypeID<>'0'
BEGIN
SET @SQLSTATEMENT + ' AND DT.DocumentTypeID='+@DocumentTypeID+' '
END
EXEC(@SQLSTATEMENT)
END
嘗試
SET @SQLSTATEMENT = @SQLSTATEMENT + <rest>
即
SET @SQLSTATEMENT = @SQLSTATEMENT + ' AND TA.AreaID='+STR(@AreaID)+' '
@Area
id聲明為INT
,您需要將其@Area
為varchar
才能附加。
嘗試這個:
SET @SQLSTATEMENT + ' AND TA.AreaID='+cast(@AreaID as varchar(30))+' '
另一種選擇是使用不需要動態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 = x將始終為false)。
這很可能導致更好的查詢,可以將其緩存和重用。 但是,需要注意的一件事是參數嗅探:如果您第一次在所有參數= 0的情況下運行此SP,則優化器將選擇(並緩存)與大多數參數非零的情況截然不同的執行計划。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.