2010-04-07 6 views
1
ALTER PROCEDURE [dbo].[GetDocumentsAdvancedSearch] 
      @SDI CHAR(10) = NULL 
      ,@Client CHAR(4) = NULL 
      ,@AccountNumber VARCHAR(20) = NULL 
     ,@Address VARCHAR(300) = NULL 
     ,@StartDate DATETIME = NULL 
     ,@EndDate DATETIME = NULL 
     ,@ReferenceID CHAR(14) = NULL 
    AS 
    BEGIN 
     -- SET NOCOUNT ON added to prevent extra result sets from 
     -- interfering with SELECT statements. 
     SET NOCOUNT ON; 

     -- DECLARE 
     DECLARE @Sql  NVARCHAR(4000) 
     DECLARE @ParamList NVARCHAR(4000) 

     SELECT @Sql = 'SELECT 
         DISTINCT ISNULL(Documents.DocumentID, '') 
         ,Person.Name1 
         ,Person.Name2 
         ,Person.Street1 
         ,Person.Street2 
         ,Person.CityStateZip 
         ,ISNULL(Person.ReferenceID,'') 
         ,ISNULL(Person.AccountNumber,'') 
         ,ISNULL(Person.HasSetPreferences,0) 
         ,Documents.Job 
       ,Documents.SDI 
         ,Documents.Invoice 
         ,ISNULL(Documents.ShippedDate,'') 
         ,ISNULL(Documents.DocumentPages,'') 
         ,Documents.DocumentType 
         ,Documents.Description 
         FROM 
         Person 
         LEFT OUTER JOIN Documents ON Person.PersonID = Documents.PersonID 
         LEFT OUTER JOIN DocumentType ON Documents.DocumentType = DocumentType.DocumentType 
         LEFT OUTER JOIN Addressess ON Person.PersonID = Addressess.PersonID' 

     SELECT @Sql = @Sql + ' WHERE 
         Documents.SDI IN ('+ QUOTENAME(@sdi) + ') OR (Person.AssociationID = ' + ''' 000000 + ''' + 'AND Person.Client = ' + QUOTENAME(@Client) 

     IF NOT (@AccountNumber IS NULL) 
     SELECT @Sql = @Sql + 'AND Person.AccountNumber LIKE' + QUOTENAME(@AccountNumber) 
     IF NOT (@Address IS NULL) 
     SELECT @Sql = @Sql + 'AND Person.Name1 LIKE' +QUOTENAME(@Address)+ 'AND Person.Name2 LIKE' +QUOTENAME(@Address)+ 'AND Person.Street1 LIKE' +QUOTENAME(@Address)+ 'AND Person.Street2 LIKE' +QUOTENAME(@Address)+ 'AND Person.CityStateZip LIKE' +QUOTENAME(@Address) 
     IF NOT (@StartDate IS NULL) 
     SELECT @Sql = @Sql + 'AND Documents.ShippedDate >=' [email protected] 
     IF NOT (@EndDate IS NULL) 
     SELECT @Sql = @Sql + 'AND Documents.ShippedDate <=' [email protected] 
     IF NOT (@ReferenceID IS NULL) 
     SELECT @Sql = @Sql + 'AND Documents.ReferenceID =' +QUOTENAME(@ReferenceID) 

     -- Insert statements for procedure here 
     -- PRINT @Sql 
     SELECT @ParamList = '@Psdi CHAR(10),@PClient CHAR(4),@PAccountNumber VARCHAR(20),@PAddress VARCHAR(300),@PStartDate DATETIME ,@PEndDate DATETIME,@PReferenceID CHAR(14)' 
     EXEC SP_EXECUTESQL @Sql,@ParamList,@Sdi,@Client,@AccountNumber,@Address,@StartDate,@EndDate,@ReferenceID 
     --PRINT @Sql 


    END 

ERROR동적 SQL Server 저장 프로 시저

메시지 102, 수준 15, 상태 1, 줄 23 의 구문이 잘못되었습니다 '000000'근처. 메시지 레벨 15, 상태 1, 줄 23 문자열 뒤에 'AND Person.Client = [1] AND Person.AccountNumber LIKE [1]'문자가있는 닫힌 따옴표.

답변

1

체크 아웃이 선 ... 당신이 bla=0AND 같은 것을하지 않도록 반드시 공백을 추가하십시오 :

'AND Person.AccountNumber LIKE' + QUOTENAME(@AccountNumber) 
'AND Person.Name1 LIKE' +QUOTENAME(@Address)+ 'AND Person.Name2 LIKE' +QUOTENAME(@Address)+ 'AND Person.Street1 LIKE' +QUOTENAME(@Address)+ 'AND Person.Street2 LIKE' +QUOTENAME(@Address)+ 'AND Person.CityStateZip LIKE' +QUOTENAME(@Address) 

이 같은 것을 발생합니다

AND Person.AccountNumber LIKE[13123]AND Person.Name1 LIKE[bla]AND Person.Name2 LIKE[alskda] 

등등 - 당신은 약간 간격을 추가하는 것을 시작할 필요가있다!

  • 이 LIKE 키워드가 참조 것 값 사이에 공백을 넣어 :

    AND Person.AccountNumber LIKE ''' + @AccountNumber + '''' + 
    
  • 모든 앞에 공백을 넣어 당신의 문

    SELECT @Sql = @Sql + ' AND Person.Name1 LIKE ''' + @Address + 
           ''' AND Person.Name2 LIKE ''' + @Address + 
           ''' AND Person.Street1 LIKE ''' + @Address + 
           ''' AND Person.Street2 LIKE ' ........ 
    
+0

안녕하세요, 마크, 나는 변화를 만들었고 이제는 잘 작동합니다. 고마워. 고마워. – Pinu

1

그냥 값을 사용하여 QUOTENAME을 중지하십시오. 그것을 위해 사용되어서는 안됩니다.

편집 앞면에는 공백이없는 수 개의 AND도 있습니다. 명세서의

+0

나는 QUOTENAME 제거 하지만 그것은 동일한 오류를 던지고있는 stil입니다 – Pinu

+0

@ 그림 : 글쎄, 당신은 여전히 ​​문자열 값을 인용해야합니다. 그러나 QUOTENAME이 덧붙인 대괄호 ('[]')가 아닌 작은 따옴표를 사용하면 –

+0

@Pinu 내 답변을 업데이트했습니다. –