Ich möchte eine Stored Procedure erstellen, die mindestens 2 erforderliche Parameter hat, aber auch mit 2,3,4,5 ... und so weiter Parametern aufgerufen werden kann. Der Grund: Ich habe mehrere Tabellen, die Schlüssel-Wert-Paare haben, aber dann kann dieser Schlüssel-Wert eine Gruppe zu einer anderen Liste von Schlüssel-Wert-Paaren sein. Damit ist der erste der übergeordnete Schlüssel zur nächsten Liste. Dies ist ein Beispiel von zwei Tabellen, die mit dem gleichen Verfahren genannt werden, die später detailliert beschrieben wird:Gespeicherte SQL-Prozedur mit unendlichen optionalen Parametern
--MyListTableAlpha
+- Key1 (ValueA)
+- Key2 (ValueB)
+- Key3 (ValueC)
+- Key4 (ValueD)
--MyListTableBravo
+- Parent Uno
+- Key1 (Value1A)
+- Key2 (Value1B)
+- Parent Dos
+- Key1 (Value2A)
+- Key2 (Value2B)
+- Key3 (Value3C)
Der Code für SQL Server sein muss 2008.
Dies ist, was habe ich für die 2 paremeter Stored Procedure:
CREATE PROCEDURE [dbo].[SPListValue]
-- Add the parameters for the stored procedure here
@listName nvarchar(100) = null,
@keyVal nvarchar(100) = null
-- optional parameters go here?!?
AS
BEGIN
SET NOCOUNT ON;
SELECT [value_string] from [tablenames]
JOIN [keyvalues] on [tablenames].[id] = [keyvalues].[tableid]
WHERE [dbo].[keyvalues].[key] = @keyVal
END
Tabelle [keyvalues]
hat die Spalten: id
, tableid
, parentkeyid
, key
, value
. Dabei wird parentkeyid
verwendet, wenn die Werte gruppiert sind, um zu wissen, zu welcher Gruppe sie gehören.
Dies ist, wie ich MyListTableAlpha
von meinem Java-Code (Hinweis 2 s?) Nennen möchte:
CallableStatement cs1 = conn1.prepareCall("{call SPListValue(?,?}"); //notice 2 ?s
cs1.setString(1, "MyListTableAlpha");
cs1.setString(2, "Key1");
ResultSet rs1 = cs1.executeQuery();
rs1.next();
value = rs1.getString("value_string"); // Prints ValueA
Dies ist, wie ich MyListTableBravo
von meinem Java-Code aufrufen möchten (Hinweis 3 s?) :
CallableStatement cs1 = conn1.prepareCall("{call SPListValue(?,?,?}"); //notice 3 ?s
cs1.setString(1, "MyListTableBravo");
cs1.setString(2, "Parent Uno");
cs1.setString(3, "Key2");
ResultSet rs1 = cs1.executeQuery();
rs1.next();
value = rs1.getString("value_string"); // Prints Value1B
wie Sie ein schlecht gebrochenes DB-Design haben Sieht aus. – Oded
Das DB-Design funktioniert so, dass ich die gruppierten Schlüsselwerte haben kann, falls gewünscht. Es wurde verdummt, um diese Frage zu stellen. Meine Frage ist, wie man der SQL Stored Procedure unendlich viele Parameter hinzufügen kann. – elcool
Sie haben eine bessere Chance auf Erfolg, wenn Sie eine obere Grenze etwas weniger als unendlich wählen. – AShelly