Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 sql server中的过程(获取问题)?_Sql Server 2005 - Fatal编程技术网

Sql server 2005 sql server中的过程(获取问题)?

Sql server 2005 sql server中的过程(获取问题)?,sql-server-2005,Sql Server 2005,在我的应用程序中,我正在实现搜索,这就像用户在文本框中输入用逗号分隔的文本一样,搜索结果将显示出来。这是我的要求,为此我写了一个程序,就像这样 create procedure [dbo].[videos_getSearch](@searchstring AS VARCHAR(1000)) AS BEGIN DECLARE @CurNumber INT, @CommaIndex INT, @strSearch varchar(3000),@str varchar(50) declar

在我的应用程序中,我正在实现搜索,这就像用户在文本框中输入用逗号分隔的文本一样,搜索结果将显示出来。这是我的要求,为此我写了一个程序,就像这样

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个表。你能帮我吗

列名称“tags”不明确。 Msg 209,16级,状态1,第1行 列名称“tags”不明确。 Msg 209,16级,状态1,第1行
列名称“tags”不明确

错误是这一行:

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

您需要指定或标记的表,如

错误如下:

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

您需要为或标记指定哪个表,如

问题在于这一行:

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

据我所知,您要加入的所有表都有一个tags列,在此where子句中,您没有指定要根据哪个表进行筛选,问题是这一行:

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

据我所知,您要加入的所有表都有一个tags列,并且在where子句中,您没有指定要通过哪个表进行筛选,您当前使用基于用户输入的动态SQL的方法容易受到SQL注入的攻击。我对它进行了修改,以便将搜索词放入一个表变量中,然后将其连接起来。这样更安全

此外,我不确定所需的语义。动态SQL WHERE子句是WHERE phot_album.tags(如“++@strearch+”或trailor_creation.tags(如“++@strearch+”)或video_upload.tags(如“++@strearch

但您的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

当前使用基于用户输入的动态SQL的方法容易受到SQL注入的影响。我对它进行了修改,以便将搜索词放入一个表变量中,然后将其连接起来。这样更安全

此外,我不确定所需的语义。动态SQL WHERE子句是WHERE phot_album.tags(如“++@strearch+”或trailor_creation.tags(如“++@strearch+”)或video_upload.tags(如“++@strearch

但您的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

Ye Verdan先生,我怎么能说标签是这个表呢?你能解决这个查询吗?谢谢你的回答。正如上面所说,你必须指定这个表,但是在查看你的查询后,我发现你在3个不同的表中使用了与where子句相同的字符串。phot_album.tags(如“++@strearch+”)或trailor_creation.tags(如“++@strearch+”)或video_upload.tags(如“++@strearch”)恐怕在这种情况下,您必须更改查询中的某些内容,您将无法使用相同的where子句字符串使用它。顺便说一句,我不知道它是否只是在帖子中,但似乎你忘了在@strearchmr的末尾加上@searchstring。Verdan感谢您的回复,但如果您不介意,我不明白您是否可以修改该查询谢谢我在sql查询方面没有那么强。是的,Verdan先生,我怎么能说标签是这个表呢?您可以解决此查询吗?谢谢您的回复如前所述,您必须指定表,但是在查看您的查询之后,我发现您在3个不同的表中使用了与where子句相同的字符串。phot_album.tags(如“++@strearch+”)或trailor_creation.tags(如“++@strearch+”)或video_upload.tags(如“++@strearch”)恐怕在这种情况下,您必须更改查询中的某些内容,您将无法使用相同的where子句字符串使用它。顺便说一句,我不知道它是否只是在帖子中,但似乎你忘了在@strearchmr的末尾加上@searchstring。Verdan感谢您的回复,但如果您不介意的话,我不明白您是否可以修改该查询谢谢您我在sql查询方面没有那么强。ck如何指定表名。你能告诉我吗。感谢您的回复您需要在手前添加正确的表名并加上句号。之间,与select语句中相同。ck先生,如果您不介意,可以根据我的要求更改查询吗?这是非常紧急的。谢谢你,先生。ck如何指定表名。你能告诉我吗。感谢您的回复您需要在手前添加正确的表名并加上句号。介于之间,与“选择州”中的相同
t、 如果您不介意的话,请根据我的要求更改查询。这是非常紧急的。谢谢小心,此函数可能受到SQL攻击。我看到您已将我的答案标记为已接受。只是想让你知道,如果你不知道的话,这不会再自动奖励奖金了!小心,此函数容易受到SQL攻击。我看到您已将我的答案标记为已接受。只是想让你知道,如果你不知道的话,这不会再自动奖励奖金了!