简体   繁体   English

SQL动态查询的问题

[英]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 ,您需要将其@Areavarchar才能附加。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM