Ваш текущий подход с использованием динамического 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