1

SQL Server 2008 でストアド プロシージャを作成しようとしています ( Chinookが役立つ場合) データベースの Track テーブルで、アルバム タイトル (の一部) に一致するトラックを検索します。たとえば、パラメータが「ロック」の場合、タイトルに「ロック」が含まれるアルバムのすべてのトラックをどこかに表示したいと考えています。

'rock' のハード コーディングは期待どおりに機能しますが、パラメーターとして 'rock' を使用して Management Studio からプロシージャを実行すると、多くの非 "rock" の結果が返されます。

ストアドプロシージャをいじるために使用しているスクリプトは次のとおりです。

ALTER PROCEDURE [dbo].[searchTrackAlbumTitle]
    @trackAlbumTitle nvarchar
AS
BEGIN
SET NOCOUNT ON;

    SELECT Track.TrackId
      ,Track.Name AS TrackName
      ,Artist.Name AS ArtistName
      ,Album.Title AS AlbumTitle
      ,Track.Composer
      ,Track.Milliseconds
      ,Track.Bytes
      ,MediaType.Name AS TypeName
      ,Genre.Name AS GenreName
      ,Track.UnitPrice
    FROM Track
        LEFT JOIN Album ON Track.AlbumId = Album.AlbumId
        LEFT JOIN Artist ON Album.ArtistId = Artist.ArtistId
        LEFT JOIN MediaType ON Track.MediaTypeId = MediaType.MediaTypeId
        LEFT JOIN Genre ON Track.GenreId = Genre.GenreId
    WHERE Album.Title LIKE ( '%' + @trackAlbumTitle + '%' ) -- doesn't work
    --WHERE Album.Title LIKE ( '%' + 'rock' + '%' ) -- works

END
4

2 に答える 2

2

パラメータに長さを設定します。例えば

@trackAlbumTitle NVARCHAR(255)

現在、 に切り捨てられていNVARCHAR(1)ます。詳細については、このブログ投稿を参照してください。これは にも適用されNVARCHARます。

WHERE Album.anythingまた、 と言うとにLEFT JOINなることに注意してくださいINNER JOINONしたがって、それを句に移動するか、結合を明示的に変更する必要がありINNER JOINます。今は混乱しています - あなたがどの動作を望んでいるのかわかりません (そしてそれらは異なります)。

于 2013-03-27T19:29:32.317 に答える
0

これを試して:

 WHERE Album.Title LIKE ( '%' + rtrim(@trackAlbumTitle) + '%' )
于 2013-03-27T19:29:35.817 に答える