2013-03-27 79 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