【SQL】如何为bit类型的参数取反呢?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【SQL】如何为bit类型的参数取反呢?相关的知识,希望对你有一定的参考价值。
使用的数据库为SQL2K 完整存储过程如下:
CREATE proc proc_SetStatus
@status bit,@id int,@field nvarchar(50) -- 其中@field是动态字段名 @status是bit类型的 其值是从后台传递过来 1或0
as
Exec('update tb_product set '+@field+'= '''+~@status+''' where id='''+@id+'''')
--update tb_product set @field=@status^1 where id=@id
GO
现在出现的问题是~附近有语法错误 所以前来询问高手到底错在哪里,表示感谢
二楼的朋友 还是不行 ltrim附近有语法错误
其中@status,@id不是字符类型,不能直接连接成字符串。可以用ltrim把参数转为字符类型,并去除空格。
CREATE proc proc_SetStatus
@status bit,@id int,@field nvarchar(50)
as
begin
declare @sql nvarchar(2000);
set @sql='update tb_product set '+@field+'= '''+ltrim(~@status)+''' where id='''+ltrim(@id)+'''';
Exec(@sql)
end
GO
------------------------------------------------------------
CREATE proc proc_SetStatus
@status bit,@id int,@field nvarchar(50)
as
begin
set @status=~@status;
Exec('update tb_product set '+@field+'= '''+@status+''' where id='''+@id+'''')
end
GO 参考技术A 自己定义就可以:
0:男
1:女
也可以:
1:男
0:女
bit只有0和1这两种可使用的值.
查询时可以使用case语句判断输出男或女
如:
select case sex when 1 then '男' when 0 then '女' end as 性别 from 你的表
如何为操作设置默认参数值
【中文标题】如何为操作设置默认参数值【英文标题】:How can I set default parameter value for an action 【发布时间】:2013-10-07 07:09:44 【问题描述】:当参数是字典类型时,?
例如:
public void Test(Dictionary<int, bool> dic)
...
【问题讨论】:
该方法签名无效。你想达到什么目的? 【参考方案1】:你不能给它一个你想要的默认值,因为它必须是一个编译时间常数值,但你可以这样做:
private static bool Test(Dictionary<string, string> par = null)
if(par == null) par = GetMyDefaultValue();
// Custom logic here
return false;
【讨论】:
【参考方案2】:您可以使用null
作为特殊情况,就像在其他答案中一样,但是如果您仍然希望能够调用Test(null)
并且具有与调用Test()
不同的行为,那么您必须链接重载:
public void Test(Dictionary<int, bool> dic)
//optional, stops people calling Test(null) where you want them to call Test():
if(dic == null) throw new ArgumentNullException("dic");
...
public void Test()
var defaultDic = new Dictionary<int, bool>();
Test(defaultDic);
【讨论】:
这是最好的解决方案。另外,Test()
应该是 sealed
。
此外,如果您使用 null,您不知道调用者是否也使用了 null,您可能希望捕获这种情况并抛出异常,以使 API 更干净。跨度>
@AdamHouldsworth 如果您想拨打Test(null)
并且与拨打Test()
有不同的结果,这是必须的
@AdamHouldsworth 已经明确了。干杯:)
@AdamHouldsworth @weston 对不起,伙计们。我最近也做了很多java。【参考方案3】:
您只能使用null
作为引用类型的默认参数值。
默认值必须是以下表达式类型之一:
一个常量表达式;
new ValType()
形式的表达式,其中ValType
是值类型,例如enum
或struct
;
default(ValType)
形式的表达式,其中ValType
是值类型。
MSDN
【讨论】:
他可以,如果项目是null
,可以提供默认的null
和一些合理的默认值。
是的,除非null
是一个有效的参数值。
我知道你来自哪里,基本上他无法在方法签名中提供他想要的确切默认值。不幸的是,您的回答非常明确,并没有说明 null
实际上对参考参数有效。
a constant expression;
和 null
是一个常量表达式;所以我明确地这么说。
是的,如果刚接触该语言的人知道null
是一个常量表达式并且对Dictionary<int, bool>
有效,那么这一切都紧跟在“你不能”之前,所以我仍然觉得它是不清楚。【参考方案4】:
您不能将字典设置为 NULL 以外的任何值。如果您确实尝试,例如:
public void Test(Dictionary<int, bool> dic = new Dictionary<string, string> "1", "true" )
或者其他什么,那么你会看到这个错误:
“dic”的默认参数值必须是编译时常量。
所以在这种情况下,NULL
是您唯一的选择。但是,这样做是没有意义的
public void Test(Dictionary<int, bool> dic = null)
如果调用者没有实例化新实例,最坏的情况是传入的dic
无论如何都会是NULL
,因此无论如何添加NULL
默认值没有任何好处。
【讨论】:
【参考方案5】:假设您想在方法签名中提供非null
默认值,您无法使用此类型执行此操作。但是,您有两种替代解决方案
立即浮现在脑海中。
1,使用带有默认值的可选参数,对于Dictionary
,这必须是null
(我相信除了string
之外的所有其他引用类型),您需要方法内部的逻辑来处理它:
public void Test(Dictionary<int, bool> dictionary = null)
// Provide a default if null.
if (dictionary == null)
dictionary = new Dictionary<int, bool>();
或者,我会这样做,只是使用“老式”方法重载。这使您可以区分不提供参数的人和提供null
参数的人:
public void Test()
// Provide your default value here.
Test(new Dictionary<int, bool>();
public void Test(Dictionary<int, bool> dictionary)
可选参数无论如何都会编译成重载的方法,所以它们几乎 语义相同,只是您希望在哪里表达默认值的偏好。
【讨论】:
看到这个link以上是关于【SQL】如何为bit类型的参数取反呢?的主要内容,如果未能解决你的问题,请参考以下文章