2013-03-27 53 views
1

我试图创建SQL Server 2008中搜索(Chinook,如果它可以帮助)数据库中的曲目表匹配的专辑标题(的一部分)的轨道的存储过程。例如,当参数是“石头”,我想看看所有那些在具有技术职称的他们“摇滚”专辑某处的轨道。搜索参数不正常

硬编码“摇滚”工作正常,但是从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

我敢打赌,所有的'非 “摇滚” results'包含'r'。 – 2013-03-27 19:35:50

+1

另外这个沉默截断可能会被认定更快速地加入简单的调试101到过程的开始,如'PRINT @trackAlbumTitle;'会产生'r'。 – 2013-03-27 19:44:39

+0

谢谢。这个想法对我来说是新的,但我现在尝试了,我看到我可以看到“消息”以查看结果。 – 2013-03-27 19:54:35

回答

2

放一个长在你的参数。例如

@trackAlbumTitle NVARCHAR(255) 

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

另外请注意,如果你说WHERE Album.anythingLEFT JOIN成为INNER JOIN。所以,你要么将其移动到ON条款或更改连接到一个明确的INNER JOIN。现在它很混乱 - 我不知道你想要哪种行为(而且它们是不同的)。

+0

谢谢!当我尝试Danev先生的建议时,我徘徊在参数上,发现它是nvarchar(1)(哎呦)。我想这是搜索包括第一个字母在内的所有专辑。并感谢关于连接的信息! – 2013-03-27 19:46:51

0

试试这个:

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

感谢您的建议。我想这个问题的确是我没有在第一时间指定长度。在LIKE之后将鼠标悬停在我的参数上,我看到它是nvarchar(1)! – 2013-03-27 19:41:53