2010-06-30 2 views
1

내 응용 프로그램에서 나는 검색을 구현하고 있는데, 사용자가 텍스트 상자에 쉼표로 구분 된 텍스트를 입력하면 검색 결과가 표시되는 것과 같다. 이것은 나의 요구 사항이며,이를 위해 나는이처럼 이것에 대한 절차를 ....... 쓰기절차 (문제 발생)?

create procedure [dbo].[videos_getSearch](@searchstring AS VARCHAR(1000)) 
AS 
BEGIN 

DECLARE @CurNumber INT, @CommaIndex INT, @strSearch varchar(3000),@str varchar(50) 
declare @strQuery varchar(1000),@result varchar(5000) 
declare @sql varchar(2000) 
DECLARE @CurNumStr VARCHAR(20) 

    set @strSearch = '' 

WHILE LEN(@searchstring) > 0 
BEGIN 

    SET @CommaIndex = CHARINDEX(',', @searchstring) 
    IF @CommaIndex = 0 SET @CommaIndex = LEN(@searchstring)+1 
    SET @CurNumStr = SUBSTRING(@searchstring, 1, @CommaIndex-1) 
    SET @searchstring = SUBSTRING(@searchstring, @CommaIndex+1, LEN(@searchstring)) 

    BEGIN 

     set @str = ltrim(rtrim(@CurNumStr)) 
     if LEN(@searchstring)> 0 
      begin 
      set @strSearch = @strSearch + '''%' + @str +'%'''+'or tags like' 
      end 
     else 
      begin 
      set @strSearch = @strSearch + '''%'+ @str +'%''' 
      end 
    END 
END 



    set @sql='SELECT phot_album.albumid,phot_album.tags,phot_album.albumtitle,phot_album.coverphoto,trailor_creation.trailorid,trailor_creation.tags,trailor_creation.movie,trailor_creation.images,video_upload.videoid,video_upload.videotitle,video_upload.videofile,video_upload.tags FROM phot_album INNER JOIN trailor_creation ON phot_album.tags = trailor_creation.tags INNER JOIN video_upload ON phot_album.tags = video_upload.tags where (phot_album.tags) like '[email protected] +' or (trailor_creation.tags) like '[email protected] +' or (video_upload.tags) like '[email protected] 
    execute (@sql) 

END 

나는 내가 생각이 절차에 ambigious '태그'와 같은 오류를주고있다이 절차를 실행할 때 3 개의 테이블을 합칩니다. 도와주세요

모호한 열 이름 'tags'. 메시지 209, 수준 16, 상태 1, 줄 1 모호한 열 이름 'tags'. 메시지 209, 수준 16, 상태 1, 줄 1 모호한 열 이름 'tags'. 당신이 줄 수있는 or tags like

+0

이 기능은 SQL 공격에주의해야합니다. – DanDan

+0

내 대답에 동의 한 것으로 표시되어 있습니다. 단지 당신이 그 사실을 알지 못했을 때를 대비하여 현상금이 자동으로 더 이상 수여되지 않는다는 것을 당신에게 알려주는 것입니다! –

답변

2

사용자 입력에 따라 동적 SQL을 사용하는 현재 접근법은 SQL 삽입에 취약합니다. 검색 조건이 결합 된 테이블 변수에 넣어 지도록 변경했습니다. 이것은 더 안전합니다.

또한 원하는 의미에 대해 잘 모르겠습니다. 동적 SQL WHERE 절이 where (phot_album.tags) like '[email protected] +' or (trailor_creation.tags) like '[email protected] +' or (video_upload.tags) like '[email protected]

이지만 JOIN 절이 태그에 조인 된 레코드를 가져옵니다. 이 경우 모든 테이블의 태그 값이 동일하며 둘 중 하나만 확인하면됩니다.

CREATE PROCEDURE [dbo].[videos_getSearch](@searchstring AS VARCHAR(1000)) 
AS 
BEGIN 

DECLARE @CurNumber INT, @CommaIndex INT, @strSearch VARCHAR(3000),@STR VARCHAR(50) 
DECLARE @strQuery VARCHAR(1000),@RESULT VARCHAR(5000) 
DECLARE @SQL VARCHAR(2000) 
DECLARE @CurNumStr VARCHAR(20) 


WHILE LEN(@searchstring) > 0 
BEGIN 

    SET @CommaIndex = CHARINDEX(',', @searchstring) 
    IF @CommaIndex = 0 SET @CommaIndex = LEN(@searchstring)+1 
    SET @CurNumStr = SUBSTRING(@searchstring, 1, @CommaIndex-1) 
    SET @searchstring = SUBSTRING(@searchstring, @CommaIndex+1, LEN(@searchstring)) 

    DECLARE @SearchTerms TABLE 
    (
    Term VARCHAR(50) 
    ) 

    BEGIN 

     SET @STR = LTRIM(RTRIM(@CurNumStr)) 
     INSERT INTO @SearchTerms VALUES (@STR) 
    END 
END 


SELECT phot_album.albumid  , 
     phot_album.tags   , 
     phot_album.albumtitle  , 
     phot_album.coverphoto  , 
     trailor_creation.trailorid, 
     trailor_creation.tags  , 
     trailor_creation.movie , 
     trailor_creation.images , 
     video_upload.videoid  , 
     video_upload.videotitle , 
     video_upload.videofile , 
     video_upload.tags 
FROM phot_album 
     INNER JOIN trailor_creation 
     ON  phot_album.tags = trailor_creation.tags 
     INNER JOIN video_upload 
     ON  phot_album.tags = video_upload.tags 
     INNER JOIN @SearchTerms ST 
     ON  phot_album.tags LIKE '%' + ST.Term + '%' 



END 

사실 나는이 같은 것이 더 필요한 것일 수 있습니다. 표의 태그 열에 쉼표로 구분 된 태그 목록이 있습니까? 그렇다면 이것을 첫 번째 정규 형식으로 변환하면이 쿼리가보다 간단하고 효율적으로 수행 될 수 있습니다.

CREATE PROCEDURE [dbo].[videos_getSearch] 
(
@searchstring AS VARCHAR(1000) 
) 
AS 
    BEGIN 

     DECLARE @SearchTerms TABLE 
     ( 
     Term VARCHAR(50) 
     ) 

     DECLARE @CommaIndex INT 
     DECLARE @CurNumStr VARCHAR(20) 

     WHILE LEN(@searchstring) > 0 
     BEGIN 
      SET @CommaIndex = CHARINDEX(',', @searchstring) 

      IF @CommaIndex = 0 
       SET @CommaIndex = LEN(@searchstring)+1 

      SET @CurNumStr = SUBSTRING(@searchstring, 1, @CommaIndex-1) 
      SET @searchstring = SUBSTRING(@searchstring, @CommaIndex+1, LEN(@searchstring)) 

      BEGIN 
       INSERT 
       INTO @SearchTerms VALUES 
        ('%' + LTRIM(RTRIM(@CurNumStr)) + '%') 
      END 
     END 


     SELECT 'phot_album' AS Source , 
      phot_album.albumid AS entityId , 
      phot_album.tags    , 
      phot_album.albumtitle AS title , 
      phot_album.coverphoto AS image 
     FROM phot_album 
      INNER JOIN @SearchTerms ST 
      ON phot_album.tags LIKE ST.Term 

     UNION ALL 

     SELECT 'trailor_creation' AS Source , 
      trailor_creation.trailorid  , 
      trailor_creation.tags   , 
      trailor_creation.movie   , 
      trailor_creation.images 
     FROM trailor_creation 
      INNER JOIN @SearchTerms ST 
      ON trailor_creation.tags LIKE ST.Term 

     UNION ALL 

     SELECT 'video_upload' AS Source , 
      video_upload.videoid  , 
      video_upload.tags   , 
      video_upload.videotitle  , 
      video_upload.videofile 
     FROM video_upload 
      INNER JOIN @SearchTerms ST 
      ON video_upload.tags LIKE ST.Term 
    END 
1

오류는이 라인

내가 무엇을 말할 수에서
set @strSearch = @strSearch + '''%' + @str +'%'''+'or tags like' 

, 모든 합류하는 테이블에 tags 열이 있고이 where 절에서 필터링 할 테이블을 지정하지 마십시오

+0

Mr. ck 어떻게 테이블 이름을 지정할 수 있습니까? 제발 말해 줄 수 있어요. 답장을 보내 주셔서 감사합니다 –

+1

올바른 표 이름을 앞에두고 선택 문에서와 마침표'.' 사이에 추가해야합니다. – cjk

+0

Mr.ck 만약 당신이 내 요구 사항에 따라 쿼리를 바꿀 수있어 매우 시급합니다. 감사합니다 –

1

문제에 대한 어떤 테이블 지정해야

set @strSearch = @strSearch + '''%' + @str +'%'''+'or tags like' 

:

+0

예. Verdan 씨.이 태그가이 테이블에서이 쿼리를 어떻게 해결할 수 있습니까? 응답 해 주셔서 감사합니다. –

+1

위의 ck처럼 테이블을 지정해야하지만 쿼리를보고 난 후에 세 개의 다른 테이블에 대해 where 절과 동일한 문자열을 사용합니다. '+ @strSearch +'또는 '+ @strSearch +'또는 (video_upload.tags) '+ @strSearch와 같은 (trailor_creation.tags) 과 같은 (phot_album.tags) 조회에서 내용을 변경하려면 동일한 where 절 문자열을 사용하여이를 사용할 수 없습니다. 참고로, 게시물에있는 것이 아닌지 모르겠지만 @strSearch의 끝에 @searchstring을 넣는 것을 잊어 버린 것 같습니다. – Vedran

+0

Verdan 씨가 응답 해 주셔서 감사하지만 이해하지 못했습니다. 마음이 그 쿼리를 수정할 수 있습니다. –