传递默认参数值vs不传递参数?

时间:2009-05-07 21:35:57

标签: sql-server stored-procedures parameters default

这就是我想要做的事情:

给出一个表

PeopleOutfit (id int primary key, boots int, hat int)

和存储过程

UpdateOutfit @id int, @newBoots int = null, @newHat = null

有没有办法判断我是否将此程序称为

exec UpdateOutfit @id=1, @newBoots=null, @newHat=5

有效地告诉id为1的人现在必须赤脚并且戴上第五顶帽子

exec UpdateOutfit @id=1, @newHat=5

指示这个人戴第五顶帽子保持现有的靴子?

换句话说,我想告诉(在存储过程中)“是否使用了默认值,因为它未被指定”来自“我明确调用此过程传递的值与默认值相同”

我知道有几种方法可以完成我想要做的事情,例如传递XML或正在更新的字段的位掩码,但目前我只是想确定这种技术是否可行。

编辑:传递保留值对于小范围类型(​​如位)的字段不起作用。重载过程也是一种不可接受的选项。使用额外的“NotAValue”值创建扩展NULL范例的用户定义类型可能是一个答案,但我需要更多关于如何实现它的指导。

5 个答案:

答案 0 :(得分:1)

不,默认的null“看起来”与传入null

相同

可能使你的默认值为-1,并使用逻辑来做不同的事情。

答案 1 :(得分:1)

我的猜测是否定的,你不能把这两件事分开。

我的建议是使用一个永远不会作为参数传入的默认值。即如果默认值为null,那么您可以传递0作为@newBoots

的值

答案 2 :(得分:0)

严格地说,不,没有真正的设施来实现这一目标。但是,您可以尝试使用某种保留值作为参数(例如,一个非常小的负数)来表示这一点。

答案 3 :(得分:0)

我自己从未这样做过;将3状态位(使用整数)引入某些代码来处理位情况。我无法访问SQL服务器,但我确实喜欢latteral思考;但我认为你可能能够通过一些管理视图/函数来解决ysubg字符串操作问题。你需要运行很多特权,但如果它绝对必要,我不知道为什么你不能使用这样的东西从st.text中解决它

SELECT  
    st.text
FROM
    sys.dm_exec_requests r
CROSS APPLY 
    sys.dm_exec_sql_text(sql_handle) AS st
WHERE
    r.session_id = @@SPID

答案 4 :(得分:0)

如上所述,TSQL不区分提供默认值和不提供值。我认为引擎基本上替换了任何缺失参数的默认值(或使用DEFAULT关键字调用的params。)

相反,使用0作为“No Hat”,并将NULL作为未指定的参数。这是NULL的首选使用,它表示未知或未指定的值。通过使用NULL作为“No Hat”,您已经选择将其添加到数据类型范围中的额外值。

根据BIT数据类型来考虑它。数据类型被定义为表示二进制值(1或0,或T / F,如果您更喜欢将其视为布尔值。)通过将NULL视为有效值,您已将数据类型扩展到二进制选项之外(现在具有三个选项,1/0 / NULL。)我的建议总是如果你发现当前数据类型中的值已经用完了,那么你使用的类型太小了。

返回存储过程调用;如果将默认值设置为NULL,并将NULL视为未设置或未指定,则调用者应始终在调用proc时指定非空值。如果得到NULL,则假设它们没有提供值,提供NULL或使用DEFAULT关键字。