2011-07-29 30 views
1

こんにちは、私は動的節を持つストアドプロシージャを持っています、これは私のストアドプロシージャのようなものです。ストアドプロシージャの動的where句の記述

SELECT Comment.AddDate,Event.StartTime,Users.Name 
FROM Comment 
JOIN Users on Users.USERS_ID = Comment.UserID 
JOIN Event ON Users.USERS_ID = Event.UserID 

変数@Nameを渡すと、ストアドプロシージャは次のようになります。

SELECT Comment.AddDate,Event.StartTime,Users.Name 
FROM Comment 
JOIN Users on Users.USERS_ID = Comment.UserID 
JOIN Event ON Users.USERS_ID = Event.UserID 
WHERE Name = @Name 

は、しかし、私は渡す@Nameは、私はすべてが返され、特定の名前に基づいていないしたい意味、空になりますせる場合があります。

また、イベントIDを渡す場合もありますが、これについてはどうすればいいですか?

WHERE Name = COALESCE(NULLIF(@Name, ''), Name) AND EventID = COALESCE(@EventID, EventID)

UPDATE:私は追加

答えて

5

あなたのような変数または既存の値、何かのいずれかを使用するようにwhere句でCOALESCE機能を使用することができますNULLIFは、COALESCE内の関数で、@Nameの値が空の文字列の場合はNULLとして扱い、したがってCOALESCEは正常に機能します。

+0

これを試みなければなりませんそれは仕事をしなかった、問題は時々@Nameはすべてが返される必要があることを意味するnullになります。 – pmillio

+2

それは意味をなさない。 COALESCEは、@NameがNULLの場合は、現在のName値を使用して、Name = Nameになります。これは常に真であるべきです。 – sellmeadog

+0

他のユーザの示唆しているように 'IS NULL OR'オプションを試すことができます。私はちょうどCOALESCEを好む – sellmeadog

3
WHERE (@Name IS NULL OR Name = @Name) 
0

動的SQLの必要がない、ただ試してみてください。

SELECT Comment.AddDate,Event.StartTime,Users.Name 
FROM Comment 
JOIN Users on Users.USERS_ID = Comment.UserID 
JOIN Event ON Users.USERS_ID = Event.UserID 
WHERE (@Name IS NULL OR Name = @Name) 
OR (@Id IS NULL OR [email protected]) 

@var IS NULLは、それが供給されていない場合column = @var述語は、これはあなたの行を選択するために、いずれかのパラメータを供給することができることを意味し、短絡が