当前位置:  开发笔记 > 数据库 > 正文

当参数为null时插入默认值

如何解决《当参数为null时插入默认值》经验,为你挑选了2个好方法。

我有一个表有一个默认值的列:

create table t (
    value varchar(50) default ('something')
)

我正在使用存储过程将值插入此表:

create procedure t_insert (
    @value varchar(50) = null
)
as 
insert into t (value) values (@value)

问题是,如何让它在默认情况下使用默认@valuenull?我试过了:

insert into t (value) values ( isnull(@value, default) )

这显然不起作用.还尝试了一个case声明,但这也不太公平.还有其他建议吗?我是以错误的方式来做这件事的吗?

更新:我正在尝试完成此操作不必:

    default在多个地方保持价值,并且

    使用多个insert语句.

如果这是不可能的,我想我只需要忍受它.这似乎应该是可以实现的.

注意:我的实际表有多个列.我只是在写一个例子.



1> Dave DuPlant..:

尝试一下if语句......

if @value is null 
    insert into t (value) values (default)
else
    insert into t (value) values (@value)



2> Eoin Campbel..:

克里斯托夫,

仅当您未在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

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有