2010-06-30 3 views
1

В моем приложении я реализую поиск, это похоже на то, что когда пользователь вводит текст, разделенный запятой в текстовое поле, будет отображаться результат поиска. Это мое требование, и для этого я пишу процедуру для этого, как это .......процедура в sql-сервере (проблема возникает)?

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 «теги» в этой процедуре я являюсь объединение трех таблиц. может помочь мне

Неоднозначное название столбца «теги». Msg 209, уровень 16, состояние 1, строка 1 Незначительное название столбца «теги». Msg 209, уровень 16, состояние 1, строка 1 Незначительное название столбца «теги».

+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' 

Вы должны указать, какие таблицы для or tags like

+0

Mr. ck Как я могу указать имя таблицы. скажите, пожалуйста. спасибо за ответ –

+1

Вам нужно добавить правильное имя таблицы перед рукой с периодом '.' между ними, так же, как в инструкции select. – cjk

+0

Mr.ck, если вы не возражаете, можете изменить запрос в соответствии с моим требованием, пожалуйста, это очень срочно. Спасибо –

1

Проблема эта линия:

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

Из того, что я могу сказать, все из таблиц, к которым вы присоединяетесь, есть столбец tags, и в этом разделе where вы не указываете, какую таблицу вы фильтруете на

+0

Я г-н Вердан. Как я могу сказать, что эта метка может решить этот вопрос. Благодарим за ответ –

+1

Как ck сказал выше, вам нужно будет указать таблицу, но, посмотрев на ваш запрос, я увидел, что вы 'используя ту же строку, что и предложение where для 3 разных таблиц. (phot_album.tags), как «+ @strSearch +» или (trailor_creation.tags), например «+ @strSearch +» или (video_upload.tags), например «+ @strSearch Я боюсь, что в этом случае у вас будет чтобы что-то изменить в вашем запросе, вы не сможете использовать его, используя ту же строку where where. На стороне заметки, я не знаю, если это просто сообщение, но, похоже, вы забыли поставить @searchstring в конце @strSearch – Vedran

+0

Mr. Verdan благодарит за ответ, но я не понимаю, если вы этого не сделаете ум может у изменить этот запрос спасибо –

Смежные вопросы