使SQLParameter可选吗?

时间:2014-12-01 20:49:21

标签: c# sql-server stored-procedures

没有过多考虑导致需要这种情况发生的情况... 看到问题的结束。

我正在调用存储过程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:从评论中添加了建议的解决方案。

2 个答案:

答案 0 :(得分:1)

很抱歉,但对此的修复是人为的,而不是代码。你的DBA正在做一些非常奇怪和愚蠢的事情:

  

在使用A的日子,DBA会更改它,以便存储过程接受@p_a和@p_b。在使用B的日子,DBA会更改它,因此存储过程只接受@p_a。

问题在于您的DBA。如果他们想要将其更改为接受@p_a和可选@p_b(即它具有默认值,很可能是null),但只是忽略@p_b好的 - 差不多。改变参数的数量是 - 我不会轻易使用它 - 愚蠢。告诉他们停止这样做。

答案 1 :(得分:1)

您可以查询存储过程以查看安装了哪个。

有关查询参数的示例,请参阅this答案。

这应该告诉你安装了哪一个,你可以根据结果建立你的参数。