0

这是我想要做的:

给定一张桌子

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 范式的用户定义类型可能是一个答案,但我需要更多关于如何实现它的指导。

4

5 回答 5

1

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

可能将您的默认值设为 -1 并使用逻辑来做一些不同的事情。

于 2009-05-07T21:38:39.770 回答
1

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

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

于 2009-05-07T21:38:57.117 回答
0

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

于 2009-05-07T21:39:36.350 回答
0

我自己从来没有这样做过;在一些代码中引入了 3 状态位(使用整数)来处理位情况。我无法访问 sql 服务器,但有时我确实喜欢后期思考;但我认为您可能能够通过某些管理视图/功能找出 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
于 2009-05-07T21:57:26.870 回答
0

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

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

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

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

于 2009-05-07T22:20:45.160 回答