【发布时间】:2010-12-07 17:52:41
【问题描述】:
我想创建一个至少有 2 个必需参数的存储过程,但它也可以用 2,3,4,5... 等参数调用。 原因:我有多个具有键值对的表,但是这个键值可以是另一个键值对列表的组。这样第一个是下一个列表的父键。 这是一个可以用相同过程调用的2个表的例子,后面会详细说明:
--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 参数存储过程所拥有的:
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 用于将值分组以知道它们属于哪一个。
这就是我想从我的 Java 代码中调用 MyListTableAlpha 的方式(注意 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
这就是我想从我的 Java 代码中调用 MyListTableBravo 的方式(注意 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
【问题讨论】:
-
看起来您的数据库设计严重损坏。
-
数据库设计正在运行,因此如果需要,我可以拥有分组的键值。提出这个问题已经被愚弄了。我的问题是如何向 SQL 存储过程添加无限参数。
-
如果你选择一个略小于无穷大的上限,你将有更大的成功机会。
标签: sql-server-2008 stored-procedures optional-parameters