[英]Issue with Sql Dynamic Query
i'm trying to write a dynamic sql.following is my stored procedure and it's having a error with appending sql query to @SQLSTATEMENT can some one help me to solve this? 我正在尝试编写动态sql。以下是我的存储过程,将sql查询附加到@SQLSTATEMENT时出错,有人可以帮助我解决这个问题吗? it shows error under the + mark 它在+标记下显示错误
EX - SET @SQLSTATEMENT + ' AND TA.AreaID='+@AreaID+' ' 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
Try 尝试
SET @SQLSTATEMENT = @SQLSTATEMENT + <rest>
ie 即
SET @SQLSTATEMENT = @SQLSTATEMENT + ' AND TA.AreaID='+STR(@AreaID)+' '
@Area
id is declared as INT
, you need to cast it to varchar
in order to be able to append it. @Area
id声明为INT
,您需要将其@Area
为varchar
才能附加。
Try this: 尝试这个:
SET @SQLSTATEMENT + ' AND TA.AreaID='+cast(@AreaID as varchar(30))+' '
Another option would be to use a query that doesn't require dynamic SQL 另一种选择是使用不需要动态SQL的查询
One possible way to do this would be: 一种可能的方法是:
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)
In this query, the search predicates you were adding dynamically are now set to compare to themselves, unless another value is specified. 在此查询中,除非指定了另一个值,否则现在将您动态添加的搜索谓词设置为与自己进行比较。 This will work as long as none of them are null (because testing for NULL=NULL or NULL=x will always be false). 只要它们都不为空,这将起作用(因为测试NULL = NULL或NULL = x将始终为false)。
This may very well result in a better query which can be cached and reused. 这很可能导致更好的查询,可以将其缓存和重用。 One thing to watch out for, however is parameter sniffing: If you run this SP the first time with all parameters = 0, the optimizer will choose (and cache) a very different execution plan than it would if most parameters are nonzero. 但是,需要注意的一件事是参数嗅探:如果您第一次在所有参数= 0的情况下运行此SP,则优化器将选择(并缓存)与大多数参数非零的情况截然不同的执行计划。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.