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)
问题是,如何让它在默认情况下使用默认@value值null?我试过了:
insert into t (value) values ( isnull(@value, default) )
Run Code Online (Sandbox Code Playgroud)
这显然不起作用.还尝试了一个case声明,但这也不太公平.还有其他建议吗?我是以错误的方式来做这件事的吗?
更新:我正在尝试完成此操作而不必:
default在多个地方保持价值,并且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)
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
据我所知,只有当您在插入语句中未指定值时才会插入默认值。因此,例如,您需要在包含三个字段的表中执行类似以下操作(默认值为 value2)
INSERT INTO t (value1, value3) VALUES ('value1', 'value3')
Run Code Online (Sandbox Code Playgroud)
然后 value2 将被默认。也许有人会插话如何对具有单个字段的表完成此操作。