当参数为null时插入默认值

chr*_*des 40 sql t-sql sql-server null stored-procedures

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

create table t (
    value varchar(50) default ('something')
)
Run Code Online (Sandbox Code Playgroud)

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

create procedure t_insert (
    @value varchar(50) = null
)
as 
insert into t (value) values (@value)
Run Code Online (Sandbox Code Playgroud)

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

insert into t (value) values ( isnull(@value, default) )
Run Code Online (Sandbox Code Playgroud)

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

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

  1. default在多个地方保持价值,并且
  2. 使用多个insert语句.

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

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

Dav*_*tis 12

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

if @value is null 
    insert into t (value) values (default)
else
    insert into t (value) values (@value)
Run Code Online (Sandbox Code Playgroud)

  • 当您有一系列参数而不是可能需要使用默认值时会发生什么? (2认同)

Eoi*_*ell 11

克里斯托夫,

仅当您未在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')
)
Run Code Online (Sandbox Code Playgroud)

创建一个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
Run Code Online (Sandbox Code Playgroud)

以下两个命令应该为您提供输出所需的示例...

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
Run Code Online (Sandbox Code Playgroud)

我知道这是一种非常复杂的方式来做你需要做的事情.您可以同样从InformationSchema中为相关列选择默认值,但说实话,我可能会考虑在程序的顶部将默认值添加到param


Bri*_*den 4

据我所知,只有当您在插入语句中未指定值时才会插入默认值。因此,例如,您需要在包含三个字段的表中执行类似以下操作(默认值为 value2)

INSERT INTO t (value1, value3) VALUES ('value1', 'value3')
Run Code Online (Sandbox Code Playgroud)

然后 value2 将被默认。也许有人会插话如何对具有单个字段的表完成此操作。