我正在使用代码执行以下存储过程,但我没有得到任何结果,有人可以帮助并解释我哪里出错吗?
这是我的SP;
ALTER PROCEDURE [dbo].[sp_SearchFilms]
-- Add the parameters for the stored procedure here
@type varchar(20),
@value varchar(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
Select * from tblFilm where @type like CONCAT('%', @value,'%');
END
我传递了以下参数 @type ='标题' @value ='Sam'
我希望这会返回Title列包含Sam名称的所有内容,而不返回任何内容。
答案 0 :(得分:0)
它没有返回任何内容,因为它引发了错误。你没有检查它是否会引发错误。
尝试这样的事情
ALTER PROCEDURE [dbo].[sp_SearchFilms]
@type varchar(20),
@value varchar(50)
AS
BEGIN
SET NOCOUNT ON;
SELECT *
FROM tblFile
WHERE
title LIKE CASE WHEN @type = 'title' then CONCAT('%', @value,'%') ELSE title END
AND
director LIKE CASE WHEN @type = 'director ' then CONCAT('%', @value,'%') ELSE director END
-- etc
END -- ALTER PROCEDURE
我个人更喜欢这个:
ALTER PROCEDURE [dbo].[sp_SearchFilms]
@title varchar(50) = null,
@director varchar(50) = null
-- etc, parameter for each search term
AS
BEGIN
SELECT *
FROM tblFile
WHERE
COALESCE(@title,title) like title
AND COALESCE(@director,director) like director
-- etc
END -- ALTER PROCEDURE
答案 1 :(得分:0)
我不明白为什么你想让这个查询复杂化。这是一个简单的查询:
SELECT * FROM tblFilm WHERE Title LIKE CONCAT('%', @value,'%');
这将搜索你。对于动态添加列名称没有任何额外的好处。
我了解您希望在查询中执行搜索。在这种情况下,您可以在查询中添加多个列,如下所示:
SELECT * FROM tblFilm WHERE Title LIKE CONCAT('%', @value,'%') AND genre LIKE CONCAT('%', @genre_value,'%')
我认为你会为此获得更好的查询执行计划。从长远来看,这更易于维护。我无法看到动态传递列名的好处,至少在这种情况下。
我建议你走正常路线。
希望这有帮助!!!