没有过多考虑导致需要这种情况发生的情况... 看到问题的结束。
我正在调用存储过程sp_that_I_dont_controll,它可能会或可能不会(取决于星期几)接受@p_some_parameter。有没有办法告诉SQL Parameter对象给定的参数是可选的,如果存储过程不接受具有给定名称的参数,只需忽略它?
(我试图将@p_some_parameter添加为查询的永久可选参数,但我正在寻找一个停止间隙直到那时。)
似乎我必须深入了解为什么需要这样做。
有三种软件产品使用此存储过程。
A,B和C.
A使用它,只有在具有以下参数时才有效。
PROCEDURE [dbo].[sp_example]
@p_a varchar(8),
@p_b varchar(8)
OR
PROCEDURE [dbo].[sp_example]
@p_a varchar(8),
@p_b varchar(8) = NULL
B使用它,只有在具有以下参数时才有效。
PROCEDURE [dbo].[sp_example]
@p_a varchar(8)
使用以下内容时,B不起作用:
PROCEDURE [dbo].[sp_example]
@p_a varchar(8),
@p_b varchar(8) = NULL
问题在于产品B,但我无法控制它。
在使用A的日子,DBA会更改它,以便存储过程接受@p_a和@p_b。在使用B的日子,DBA会更改它,因此存储过程只接受@p_a。
我想让C工作,无论哪个存储过程(它都不需要传入b)。
可能的解决方案:
新的存储过程:拒绝,DBA不希望我添加更多。
尝试使用@p_a和@p_b捕获调用,如果调用失败只能使用@p_a:有效,但这是一个我试图避免的丑陋解决方案。
检查当前存储过程接受的参数,并使用它控制我是否添加@p_b:工作,看起来更好,但意味着我没有使用'官方'数据访问库(老实说,我很想放弃我们正在使用的整个数据访问库,因为它提供了30多种调用存储过程的方法,其中大部分方法在添加可选的sql参数时中断)。
编辑1:添加了导致此需求的问题描述。 编辑2:从评论中添加了建议的解决方案。
答案 0 :(得分:1)
很抱歉,但对此的修复是人为的,而不是代码。你的DBA正在做一些非常奇怪和愚蠢的事情:
在使用A的日子,DBA会更改它,以便存储过程接受@p_a和@p_b。在使用B的日子,DBA会更改它,因此存储过程只接受@p_a。
问题在于您的DBA。如果他们想要将其更改为接受@p_a
和可选@p_b
(即它具有默认值,很可能是null
),但只是忽略@p_b
,好的 - 差不多。改变参数的数量是 - 我不会轻易使用它 - 愚蠢。告诉他们停止这样做。
答案 1 :(得分:1)