Кристоф,
Значение по умолчанию для столбца применяется только в том случае, если столбец не указан в операторе INSERT.
Поскольку вы явно перечислили столбец в своем операторе вставки, а для explicity задали для него значение 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, который динамически создает и выполняет оператор вставки на основе входных параметров
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
Следующие 2 команды должны дать вам пример того, что вы хотите использовать в качестве выходных данных ...
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 для соответствующих столбцов, но, если честно, я мог бы рассмотреть вопрос о добавлении значения по умолчанию к параметру в верхней части процедуры