我正在尝试在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
答案 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) + '%' )