2 Stimmen

Kombinieren Sie 'like' und 'in' in einer SqlServer Reporting Services-Abfrage?

Das Folgende funktioniert nicht, aber so etwas suche ich.

select *
from Produkte
where Beschreibung like (@SearchedDescription + %)

SSRS verwendet den @-Operator vor einem Parameter, um ein 'in' zu simulieren, und ich finde keine Möglichkeit, eine Zeichenfolge mit einer Liste von Zeichenfolgen abzugleichen.

4voto

Registered User Punkte 8214

Es gibt einige Möglichkeiten, wie Sie den LIKE-Operator mit einem Parameter verwenden können.

OPTION 1

Wenn Sie das % zum Parameterwert hinzufügen, können Sie anpassen, wie der LIKE-Filter verarbeitet wird. Zum Beispiel könnte Ihre Abfrage folgendermaßen aussehen:

 SELECT name
 FROM master.dbo.sysobjects
 WHERE name LIKE @ReportParameter1

Um das LIKE-Statement richtig zu verwenden, könnten Sie einen Parameterwert wie sysa% verwenden. Als ich einen Beispielbericht in SSRS 2008 mit diesem Code getestet habe, habe ich die folgenden vier Tabellen zurückgegeben:

 sysallocunits
 sysaudacts
 sysasymkeys
 sysaltfiles

OPTION 2

Ein weiterer Weg, dies zu tun, der nicht erfordert, dass der Benutzer das '%' Symbol hinzufügt, besteht darin, eine Variable zu generieren, die den Code enthält, und die Variable auszuführen.

 DECLARE @DynamicSQL NVARCHAR(MAX) 

 SET @DynamicSQL = 
 'SELECT  name, id, xtype
 FROM dbo.sysobjects
 WHERE name LIKE ''' + @ReportParameter1 + '%''
 '

 EXEC (@DynamicSQL)

Dies gibt Ihnen eine feinere Kontrolle darüber, wie das LIKE-Statement verwendet wird. Wenn Sie nicht möchten, dass Benutzer zusätzliche Operatoren einfügen, können Sie immer Code hinzufügen, um nicht alphanumerische Zeichen zu entfernen, bevor sie in die endgültige Abfrage eingefügt werden.

OPTION 3

Sie können eine gespeicherte Prozedur erstellen, die diese Funktionalität steuert. Ich ziehe es im Allgemeinen vor, gespeicherte Prozeduren als Datenquellen für SSRS zu verwenden und niemals dynamisch generierten SQL zuzulassen, aber das ist nur eine meiner Vorlieben. Dies hilft bei der Auffindbarkeit bei der Durchführung von Abhängigkeitsanalysen und ermöglicht es Ihnen auch, eine optimale Abfrageleistung sicherzustellen.

OPTION 4

Erstellen Sie eine .NET-Code-Bibliothek, die hilft, den SQL-Code dynamisch zu generieren. Ich denke, dies ist übertrieben und eine schlechte Wahl, aber es könnte theoretisch funktionieren.

0voto

Pulsehead Punkte 4840

Hast du versucht, dies zu tun:

select * from Produkte where Beschreibung like (@GesuchteBeschreibung + '%') (Einzelne Anführungszeichen um das % Zeichen setzen?)

0voto

Dano, welche Version von SSRS verwenden Sie? Wenn es RS2000 ist, wird die Mehrfachparameterliste nicht offiziell unterstützt, aber es gibt einen Workaround....

0voto

Pradeep sharma Punkte 1

Wie folgt eingeben:

select * 
from tsStudent 
where studentName like @SName+'%'

0voto

Jeff Breadner Punkte 1316

Ich weiß, dass das super alt ist, aber das ist in meiner Suche aufgetaucht, um das gleiche Problem zu lösen, und am Ende habe ich eine hier nicht beschriebene Lösung verwendet. Ich füge eine neue potenzielle Lösung hinzu, um anderen zu helfen, die folgen könnten.

Wie geschrieben, funktioniert diese Lösung nur in SQL Server 2016 und später, kann aber für ältere Versionen angepasst werden, indem eine benutzerdefinierte string_split UDF geschrieben wird und indem anstelle eines CTE ein Subquery verwendet wird.

Erstmal, mappe dein @SearchedDescription in deinen Dataset als einen einzigen String mit JOIN:

=JOIN(@SearchedDedscription, ",")

Verwende dann STRING_SPLIT, um deinen "A,B,C,D" ähnlichen String in eine tabellarische Struktur zu überführen.

;with
SearchTerms as (
  select distinct
    Value
  from 
    string_split(@SearchedDescription, ',')
)
select distinct
  *
from
  Products
  inner join SearchTerms on
    Products.Description like SearchTerms.Value + '%'

Wenn jemand den gleichen Suchbegriff mehrmals hinzufügt, würde dies zu Duplikaten in den Ergebnissen führen. Ebenso könnte ein einzelnes Produkt mehreren Suchbegriffen entsprechen. Ich habe distinct sowohl zur SearchTerms CTE als auch zur Hauptabfrage hinzugefügt, um diese unangemessene Zeilenduplizierung zu unterdrücken.

Wenn deine Abfrage komplexer ist (einschließlich Ergebnissen aus anderen Joins), könnte dies zu einem zunehmend großen Problem werden. Sei dir dessen bewusst, das ist der Hauptnachteil dieser Methode.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X