1

我正在尝试在 SQL Server 2008 中创建一个存储过程,该过程在(Chinook,如果有帮助的话)数据库的 Track 表中搜索与专辑标题(部分)匹配的曲目。例如,当参数为“rock”时,我想查看专辑中在某处具有“rock”标题的所有曲目。

硬编码“rock”按预期工作,但从 Management Studio 以“rock”作为参数运行该过程会返回许多非“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.anythingLEFT JOIN变成INNER JOIN. 因此,您应该将其移至ON子句或将连接更改为显式INNER JOIN. 现在很混乱 - 我不知道你想要哪种行为(而且它们是不同的)。

于 2013-03-27T19:29:32.317 回答
0

试试这个:

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