这就是我想要做的事情:
给出一个表
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范例的用户定义类型可能是一个答案,但我需要更多关于如何实现它的指导。
答案 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关键字。