存储过程中的搜索参数不起作用

时间:2013-03-27 19:26:25

标签: sql-server-2008 stored-procedures

我正在尝试在SQL Server 2008中创建一个存储过程,搜索(Chinook,如果它有帮助)数据库的Track表,找到与相册(部分)相匹配的曲目。例如,当参数为“摇滚”时,我希望看到相册中所有曲目都有“摇滚”的曲目。

硬编码“摇滚”按预期工作,但是使用“摇滚”作为参数从Management Studio运行程序会返回大量非“摇滚”结果。

以下是我用来修改存储过程的脚本:

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

2 个答案:

答案 0 :(得分:2)

在参数上加上一个长度。 e.g。

@trackAlbumTitle NVARCHAR(255)

现在它被截断为NVARCHAR(1)See this blog post for more info - 它也适用于NVARCHAR

另请注意,如果您说WHERE Album.anything LEFT JOIN成为INNER JOIN。因此,您应该将其移至ON子句或将连接更改为显式INNER JOIN。现在它令人困惑 - 我不知道你想要哪种行为(而且它们是不同的)。

答案 1 :(得分:0)

试试这个:

 WHERE Album.Title LIKE ( '%' + rtrim(@trackAlbumTitle) + '%' )