Я хочу создать хранимую процедуру, которая имеет как минимум 2 требуемых параметра, но также может быть вызвана с параметрами 2,3,4,5 ... и так далее. Причина: У меня есть несколько таблиц, имеющих пары «ключ-значение», но тогда это значение «ключ-значение» может быть группой в другой список пар «ключ-значение». Итак, первый из них является родительским ключом к следующему списку. Это пример 2 таблицы, которые могут быть вызваны с той же процедурой, которая подробно впоследствии:SQL Хранимая процедура с бесконечными необязательными параметрами
--MyListTableAlpha
+- Key1 (ValueA)
+- Key2 (ValueB)
+- Key3 (ValueC)
+- Key4 (ValueD)
--MyListTableBravo
+- Parent Uno
+- Key1 (Value1A)
+- Key2 (Value1B)
+- Parent Dos
+- Key1 (Value2A)
+- Key2 (Value2B)
+- Key3 (Value3C)
Код должен быть для SQL Server 2008.
Это то, что у меня есть для 2 paremeter хранимых процедур:
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
Таблица [keyvalues]
имеет столбцы: id
, tableid
, parentkeyid
, key
, value
. Где parentkeyid
используется, когда значения группируются, чтобы знать, к какому из них принадлежит.
Это, как я хотел бы назвать MyListTableAlpha
от моего Java кода (уведомление 2 s):
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
Это, как я хотел бы назвать MyListTableBravo
от моего Java кода (заметьте 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
Похоже, у вас есть плохо сломанный дизайн DB. – Oded 2010-12-07 17:54:06
Конструкция БД работает так, что при желании я могу иметь сгруппированные значения ключа. Это было подавлено, чтобы представить этот вопрос. Мой вопрос заключается в том, как добавить бесконечные параметры в хранимую процедуру SQL. – elcool 2010-12-07 18:33:25