процедура в SQL Server (получение проблемы)? - PullRequest
1 голос
/ 30 июня 2010

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

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  '+@strSearch  +' or  (trailor_creation.tags)  like '+@strSearch  +' or  (video_upload.tags) like '+@strSearch  
     execute (@sql)

 END

когда я запускаю эту процедуру, она выдает ошибку, похожую на неоднозначные «теги», в этой процедуре я объединяю 3 таблицы. ты можешь мне помочь

Неоднозначное имя столбца 'теги'. Сообщение 209, Уровень 16, Состояние 1, Строка 1 Неоднозначное имя столбца «теги». Сообщение 209, Уровень 16, Состояние 1, Строка 1 Неоднозначное имя столбца «теги».

Ответы [ 3 ]

2 голосов
/ 03 июля 2010

Ваш текущий подход с использованием динамического SQL, основанного на пользовательском вводе, уязвим для внедрения SQL. Я изменил его, чтобы поисковые термины помещались в переменную таблицы, которая затем включалась. Это безопаснее.

Кроме того, я не уверен в желаемой семантике. Ваше динамическое предложение SQL WHERE: where (phot_album.tags) like '+@strSearch +' or (trailor_creation.tags) like '+@strSearch +' or (video_upload.tags) like '+@strSearch

но ваше предложение 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 голос
/ 30 июня 2010

Проблема в этой строке:

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

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

1 голос
/ 30 июня 2010

Ошибка в этой строке:

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

Вам необходимо указать таблицу для or tags like

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...