Gibt es eine angemessene Möglichkeit, eine Liste von IDs als Parameter an eine gespeicherte Prozedur zu übergeben?
Zum Beispiel möchte ich, dass die Abteilungen 1, 2, 5, 7, 20 von meiner gespeicherten Prozedur zurückgegeben werden. In der Vergangenheit habe ich eine durch Kommas getrennte Liste von IDs wie den folgenden Code übergeben, aber ich fühle mich dabei wirklich schmutzig.
SQL Server 2005 ist meiner Meinung nach meine einzige anwendbare Einschränkung.
create procedure getDepartments
@DepartmentIds varchar(max)
as
declare @Sql varchar(max)
select @Sql = 'select [Name] from Department where DepartmentId in (' + @DepartmentIds + ')'
exec(@Sql)
sql-server
tsql
stored-procedures
JasonS
quelle
quelle
Antworten:
Erland Sommarskog hat die maßgebliche Antwort auf diese Frage in den letzten 16 Jahren beibehalten: Arrays und Listen in SQL Server .
Es gibt mindestens ein Dutzend Möglichkeiten, ein Array oder eine Liste an eine Abfrage zu übergeben. Jeder hat seine eigenen Vor- und Nachteile.
Ich kann wirklich nicht genug empfehlen, um den Artikel zu lesen und mehr über die Kompromisse zwischen all diesen Optionen zu erfahren.
quelle
Ja, Ihre aktuelle Lösung ist anfällig für SQL-Injection-Angriffe.
Die beste Lösung, die ich gefunden habe, besteht darin, eine Funktion zu verwenden, die Text in Wörter aufteilt (es gibt einige hier, oder Sie können diese aus meinem Blog verwenden ) und diese dann mit Ihrer Tabelle zu verbinden. Etwas wie:
quelle
Eine Methode, die Sie in Betracht ziehen sollten, wenn Sie häufig mit den Werten arbeiten, besteht darin, sie zuerst in eine temporäre Tabelle zu schreiben. Dann machst du einfach wie gewohnt mit.
Auf diese Weise analysieren Sie nur einmal.
Es ist am einfachsten, eine der 'Split'-UDFs zu verwenden, aber so viele Leute haben Beispiele dafür veröffentlicht, dass ich dachte, ich würde einen anderen Weg gehen;)
In diesem Beispiel wird eine temporäre Tabelle erstellt, an der Sie teilnehmen können (#tmpDept), und diese mit den von Ihnen übergebenen Abteilungs-IDs gefüllt. Ich gehe davon aus, dass Sie sie durch Kommas trennen, aber Sie können sie natürlich ändern es zu was auch immer Sie wollen.
Auf diese Weise können Sie eine Abteilungs-ID, mehrere IDs mit Kommas dazwischen oder sogar mehrere IDs mit Kommas und Leerzeichen dazwischen übergeben.
Also, wenn Sie so etwas gemacht haben:
Sie sehen die Namen aller Abteilungs-IDs, die Sie übergeben haben ...
Auch dies kann vereinfacht werden, indem eine Funktion zum Auffüllen der temporären Tabelle verwendet wird ... Ich habe es hauptsächlich ohne eine getan, nur um Langeweile zu vertreiben :-P
- Kevin Fairchild
quelle
Sie könnten XML verwenden.
Z.B
Der Befehl sp_xml_preparedocument ist integriert.
Dies würde die Ausgabe erzeugen:
Welches hat alles (mehr?) von dem, was Sie brauchen.
quelle
Eine superschnelle XML-Methode, wenn Sie eine gespeicherte Prozedur verwenden und die durch Kommas getrennte Liste der Abteilungs-IDs übergeben möchten:
Alle Kredite gehen an Guru Brad Schulz 'Blog
quelle
Probier diese:
sehr einfach.
quelle