So übergeben Sie eine durch Kommas getrennte Liste an eine gespeicherte Prozedur in Sybase
Bei der Arbeit mit Datenbanken können Sie auf Situationen stoßen, in denen Sie mehrere Parameter an eine gespeicherte Prozedur übergeben müssen. In Sybase kann es speziell Herausforderungen geben, wenn Sie versuchen, eine durch Kommas getrennte Liste von Zeichenfolgen zu übergeben. Dieser Blogbeitrag wird dieses Problem ansprechen und Sie Schritt für Schritt durch die Lösung führen.
Das Problem
Stellen Sie sich vor, Sie haben die folgende gespeicherte Prozedur:
CREATE PROCEDURE getSomething @keyList varchar(4096)
AS
SELECT * FROM mytbl WHERE name IN (@keyList)
Sie möchten diese gespeicherte Prozedur mit mehreren Namen aufrufen, wie 'John'
und 'Tom'
. Wenn Sie jedoch verschiedene Methoden ausprobieren, um diese Liste zu übergeben, stoßen Sie auf Probleme:
exec getSomething 'John' -- Funktioniert, aber nur 1 Wert
exec getSomething 'John','Tom' -- Funktioniert nicht; erwartet zwei Variablen
exec getSomething "'John','Tom'" -- Funktioniert nicht; findet nichts
exec getSomething '"John","Tom"' -- Funktioniert nicht; findet nichts
exec getSomething '\'John\',\'Tom\'' -- Funktioniert nicht; Syntaxfehler
Wie zu sehen ist, wird es problematisch, direkt eine durch Kommas getrennte Liste zu übergeben. Was ist also die Lösung?
Die Lösung
In Sybase 12.5 und früheren Versionen sind Ihre Optionen eingeschränkt, da Sie Funktionen nicht direkt zum Trennen von Zeichenfolgen verwenden können. Es gibt jedoch einen praktischen Workaround, der die Verwendung einer temporären Tabelle beinhaltet, um Ihre Werte zu halten.
Verwendung einer temporären Tabelle
-
Erstellen Sie eine temporäre Tabelle, um die Werte aus Ihrer durch Kommas getrennten Liste zu speichern. Zum Beispiel:
CREATE TABLE #TempNames (Name VARCHAR(100))
-
Werte in die temporäre Tabelle einfügen, indem Sie eine Methode zum Trennen Ihrer Liste verwenden. Eine Möglichkeit, dies manuell zu erreichen, da Sybase keine integrierten Funktionen zum Trennen von Zeichenfolgen bietet, ist wie folgt:
- Möglicherweise müssen Sie dynamisches SQL verwenden oder eine benutzerdefinierte Logik schreiben, um Ihre Werte in die Tabelle
#TempNames
einzufügen. - Je nach Ihrer Anwendung oder der Version von Sybase sollten Sie in Betracht ziehen, ein Skript zu schreiben, um durch die Liste zu iterieren und jedes Element einzeln einzufügen.
- Möglicherweise müssen Sie dynamisches SQL verwenden oder eine benutzerdefinierte Logik schreiben, um Ihre Werte in die Tabelle
-
Daten aus der temporären Tabelle abrufen in Ihrer gespeicherten Prozedur. Sie können Ihre gespeicherte Prozedur so ändern:
CREATE PROCEDURE getSomething AS BEGIN DECLARE @sqlCommand VARCHAR(4096) SET @sqlCommand = 'SELECT * FROM mytbl WHERE name IN (SELECT Name FROM #TempNames)' EXEC(@sqlCommand) -- Führen Sie dynamisches SQL aus END
-
Rufen Sie Ihre Prozedur auf, nachdem Sie Daten in Ihre temporäre Tabelle eingefügt haben:
INSERT INTO #TempNames VALUES ('John'), ('Tom') EXEC getSomething
Zusätzliche Überlegungen
- Bereinigung: Denken Sie daran, die temporäre Tabelle zu löschen, sobald Sie fertig sind, um Unordnung in Ihrer Datenbankumgebung zu vermeiden.
DROP TABLE #TempNames
- Sybase-Versionen: Wenn Sie neuere Versionen von Sybase verwenden, erkunden Sie neuere Methoden oder Funktionen, die Zeichenfolgenmanipulation und Parameterverarbeitung ermöglichen.
Fazit
Das Übergeben einer durch Kommas getrennten Liste an eine gespeicherte Prozedur in Sybase mag zunächst entmutigend erscheinen, aber die Nutzung einer temporären Tabelle bietet eine einfache Lösung. Diese Methode ermöglicht es Ihnen effektiv, mehrere Parameter zu handhaben, ohne auf Syntaxprobleme zu stoßen. Wann immer Sie auf ähnliche Herausforderungen stoßen, denken Sie an diesen Leitfaden und fühlen Sie sich frei, ihn an Ihre spezifischen Bedürfnisse anzupassen.
Durch die Konzentration auf diese Schritte können Sie die Funktionalität Ihrer gespeicherten Prozeduren verbessern und Ihre Arbeitsabläufe in Sybase optimieren. Viel Spaß beim Programmieren!