2016-07-21 9 views
-1

私はコードを使用して、次のストアドプロシージャを実行していますが、結果が得られません。誰かが助けて、どこが間違っているのか説明できますか?ストアドプロシージャから結果が得られないのはなぜですか?

これは私の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 = 'サム

を次のパラメータを渡しています、代わりにそれは何も返しません。

+3

あなたは 'select'ステートメントをビルドするために' dynamic sql'を使う必要があります。あなたは動的にテーブル名を渡すことはできません。 – sgeddes

+0

@sgeddesはフィールド名を意味します。 – Hogan

+0

これはどのRDBMSですか? 'mysql'、' postgresql'、 'sql-server'、' oracle'、 'db2'のどれかを指定するタグを追加してください。 –

答えて

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

この方法はうまくいきますが、ほとんどの場合、まともなクエリプランを得ることはまずありません。動的SQLまたは@typeごとに1つのプロシージャは、より多くの型を犠牲にしてよりうまくいくでしょう。 – LoztInSpace

+0

@LoztInSpaceあなたは正しいです! 'WHERE'節に' AND'を使って複数の列を持つことができます。それで十分だろう。 –

+0

@ sarwiknadkarny私はその方法が同じ問題を与えるだろうと確信しています。あなたは1つのプランしか得ません。将来のデータベースでは、これは変更される可能性がありますが、現時点では、実行するクエリを前もって選択する以外に、この種のものを効率的に実行する実際の方法はありません。 – LoztInSpace

0

このクエリを複雑にしたいと思いますなぜ私は理解していません。その簡単なクエリは次のとおりです。

SELECT * FROM tblFilm WHERE Title LIKE CONCAT('%', @value,'%'); 

これで検索が行われます。カラム名を動的に追加するという利点はありません。

私はクエリで検索を実行したいと考えています。このケースでは、このようなクエリで複数の列を追加することができます。

SELECT * FROM tblFilm WHERE Title LIKE CONCAT('%', @value,'%') AND genre LIKE CONCAT('%', @genre_value,'%') 

私はあなたがこのためのより良いクエリの実行計画を取得したいと思います。これは長期的にはより保守的です。少なくともこの場合、列名を動的に渡すことの利点はありません。

私はあなたが正常なルートに行くことをお勧めします。

関連する問題