Permalänk
Medlem

Söka efter poster i MS SQL

Håller på och skriva en litet applikation för att spara böcker i, till skolan. I applikationen hade jag tänkte att det ska vara möjligt att söka på böcker (vilket känns ganska självklart). De saker man ska kunna söka på är Bokens titel, ISBN, Serie, och författare. I tabellen ligger författarens namn uppdelat i för- och efternamn. För att göra det aningen lättare för mig så använder jag fyra inputfält, en för varje del.

I MS SQL kommer sökningen ligga som en stored procedure, men fyra inputparameterar (de nämnda ovan).

Det jag funderade på var just delen med författarens namn, då det är uppdelat. Hur gör man lättast för att söka på hela namnet? Jag antar att jag jag skulle kunna sätta ihop för- och efternamn som en enda kolumn, "Namn", och sen köra WHERE Namn LIKE '%' + @Namn + '%', men det kändes inte speciellt snyggt.

Allra helst skulle jag ju vilja slänga ihop allt till ett enda sökfält, men antar att jag isåfall skulle behöva sätta ihop hela posten, dela upp söksträngen i varje ord, och köra ett reguljärt uttryck på de? Känns inte som att man skulle få någon vidare prestanda på de; det är som sagt för skolan, och antalet böcker lär antagligen inte vara mycket mer än ett 20-tal, men vi ska ändå arbeta utifrån hypotesen att det är ett system i skarp miljö med tusentals till hundratusentals böcker.

Kan även tilläggas att gränssnittet ska göras i ASP.NET med C#, men jag vill ändå (om det är möjligt att göra på ett snyggt sätt) ha sökningen på SQL Server-sidan.

Permalänk
Medlem

Är ju alltid frågan hur mycket man ska i.. Men enklast är nog att göra något liknande det du redan funderat på:

declare @search nvarchar(max) select top 100 * from tblbook where title = @search or firstName + ' ' + lastName = @search or ... -- och så vidare

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Permalänk
Medlem

För nuvarande ser det ut så här:

CREATE PROCEDURE usp_SokBok @Titel varchar(100) = '', @ISBN varchar(13) = '', @Forfattare varchar(50) = '', @Serie varchar(55) = '' AS BEGIN WITH SearchTable_CTE(Titel, ISBN, ForfattarNamn, SerieNamn, Beskrivning, Betyg) AS ( SELECT Titel, ISBN, (Fornamn + ' ' + Efternamn) AS ForfattarNamn, SerieNamn, Beskrivning, Betyg FROM Bok FULL OUTER JOIN Forfattare ON Bok.ForfattarId = Forfattare.ForfattarId FULL OUTER JOIN Serie ON Bok.SerieId = Serie.SerieId ) SELECT * FROM SearchTable_CTE WHERE Titel LIKE ('%' + @Titel + '%') AND ISBN LIKE ('%' + @ISBN + '%') AND ForfattarNamn LIKE ('%' + @Forfattare + '%') AND SerieNamn LIKE ('%' + @Serie + '%'); END

Det jag som sagt skulle vilja göra är att bara ha en inputparameter (typ @Sokstrang), och med den söka igenom den temporära tabellen, men det verkar va lite dåligt med funktioner för de..

Permalänk
Medlem

Humm, om du inte nöjde dig med mitt svar tror jag inte att jag förstår vad du vill? Vad hindrar dig från att ta in en enda @söksträng och använda den istället för @titel, @isbn osv?

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon