我有成千上万的记录行,在表中,如果没有提供基于过滤器的搜索,则希望在提供参数时进行内部联接。长期解决方案是分裂逻辑,但短期内我需要一些帮助。
我正在尝试执行以下操作:
params:
@movie_ids int_table (optional passing in a table of only ints here)
@filter_name
@filter_genre
@filter_actor_name
DECLARE @id_count = sets movie id count here or 0;
SELECT
m.Id
m.Name
m.ShortName
m.Genre
m.ImageUrl
FROM Movies m WITH(NOLOCK)
IF movie_ids <> 0
BEGIN
INNER JOIN @movie_ids mids
ON mids.id = m.Id
END
ELSE
LEFT OUTER JOIN code_genres cg
ON m.GenreId = cg.Id
INNER JOIN Actors a
ON a.name LIKE '%@filter_actor_name%'
END
WHERE m.Name LIKE '%filter_name%'
OR m.ShortName LIKE '%filter_name%'
抱歉,由于我不是原始编写者,所以我无法提供实际的存储过程。短期内我想找出的问题是找出是否可以执行此条件连接。
当前,它具有一个LEFT OUTER JOIN和一个where子句,该子句假设可以执行条件操作,但是在发生过滤器之前它返回的数据量太多-太慢。 Something like here
让我知道是否可以提供更多详细信息。
(长期解决方案已完成-从sql拆分逻辑,但我现在需要一些东西)
答案 0 :(得分:1)
如Programnik所述,您可以在此处使用动态sql。您可以尝试这样的事情:
DECLARE @sql VARCHAR(1000) = '';
@sql = @sql + 'SELECT
m.Id
m.Name
m.ShortName
m.Genre
m.ImageUrl
FROM Movies m WITH(NOLOCK)';
IF movie_ids <> 0
BEGIN
@sql = @sql + ' INNER JOIN @movie_ids mids
ON mids.id = m.Id';
END
ELSE
@sql = @sql + ' LEFT OUTER JOIN code_genres cg
ON m.GenreId = cg.Id
INNER JOIN Actors a
ON a.name LIKE' +'%@filter_actor_name%';
END
@sql = @sql + ' WHERE m.Name LIKE' + '%filter_name%';
@sql = @sql + ' OR m.ShortName LIKE' + '%filter_name%';
EXEC sp_executesql @sql