我有一个表有一个默认值的列:
create table t ( value varchar(50) default ('something') )
我正在使用存储过程将值插入此表:
create procedure t_insert ( @value varchar(50) = null ) as insert into t (value) values (@value)
问题是,如何让它在默认情况下使用默认@value
值null
?我试过了:
insert into t (value) values ( isnull(@value, default) )
这显然不起作用.还尝试了一个case
声明,但这也不太公平.还有其他建议吗?我是以错误的方式来做这件事的吗?
更新:我正在尝试完成此操作而不必:
default
在多个地方保持价值,并且
使用多个insert
语句.
如果这是不可能的,我想我只需要忍受它.这似乎应该是可以实现的.
注意:我的实际表有多个列.我只是在写一个例子.
尝试一下if语句......
if @value is null insert into t (value) values (default) else insert into t (value) values (@value)
克里斯托夫,
仅当您未在INSERT语句中指定列时,才应用列上的默认值.
由于您明确列出了insert语句中的列,并且明确地将其设置为NULL,因此它会覆盖该列的默认值
您需要做的是"如果将null传递到您的sproc中,则不要尝试为该列插入".
这是一个如何使用一些动态sql执行此操作的快速而令人讨厌的示例.
使用默认值创建一些包含某些列的表...
CREATE TABLE myTable ( always VARCHAR(50), value1 VARCHAR(50) DEFAULT ('defaultcol1'), value2 VARCHAR(50) DEFAULT ('defaultcol2'), value3 VARCHAR(50) DEFAULT ('defaultcol3') )
创建一个SPROC,根据输入参数动态构建和执行insert语句
ALTER PROCEDURE t_insert ( @always VARCHAR(50), @value1 VARCHAR(50) = NULL, @value2 VARCHAR(50) = NULL, @value3 VARCAHR(50) = NULL ) AS BEGIN DECLARE @insertpart VARCHAR(500) DECLARE @valuepart VARCHAR(500) SET @insertpart = 'INSERT INTO myTable (' SET @valuepart = 'VALUES (' IF @value1 IS NOT NULL BEGIN SET @insertpart = @insertpart + 'value1,' SET @valuepart = @valuepart + '''' + @value1 + ''', ' END IF @value2 IS NOT NULL BEGIN SET @insertpart = @insertpart + 'value2,' SET @valuepart = @valuepart + '''' + @value2 + ''', ' END IF @value3 IS NOT NULL BEGIN SET @insertpart = @insertpart + 'value3,' SET @valuepart = @valuepart + '''' + @value3 + ''', ' END SET @insertpart = @insertpart + 'always) ' SET @valuepart = @valuepart + + '''' + @always + ''')' --print @insertpart + @valuepart EXEC (@insertpart + @valuepart) END
以下两个命令应该为您提供输出所需的示例...
EXEC t_insert 'alwaysvalue' SELECT * FROM myTable EXEC t_insert 'alwaysvalue', 'val1' SELECT * FROM myTable EXEC t_insert 'alwaysvalue', 'val1', 'val2', 'val3' SELECT * FROM myTable
我知道这是一种非常复杂的方式来做你需要做的事情.您可以同样从InformationSchema中为相关列选择默认值,但说实话,我可能会考虑在程序的顶部将默认值添加到param