Это обновленный код для findOneAndUpdate
. Он работает.
db.collection.findOneAndUpdate(
{ age: 17 },
{ $set: { name: "Naomi" } },
{
returnNewDocument: true
}
)
Корреспондент должен изучить различие между пустым обеспеченным значением и пустым указателем.
Другие отправили правильный основной ответ: обеспеченное значение, включая пустой указатель, что-то , и поэтому оно используется. Значение по умолчанию ТОЛЬКО обеспечивает значение, когда ни один не обеспечивается. Но настоящей проблемой здесь является отсутствие понимания значения пустого указателя.
.
Самый легкий способ сделать это должно изменить объявление таблицы, чтобы быть
CREATE TABLE Demo
(
MyColumn VARCHAR(10) NOT NULL DEFAULT 'Me'
)
Теперь в Вашей хранимой процедуре, как которая можно сделать что-то.
CREATE PROCEDURE InsertDemo
@MyColumn VARCHAR(10) = null
AS
INSERT INTO Demo (MyColumn) VALUES(@MyColumn)
Однако этот метод ТОЛЬКО работает, если бы у Вас не может быть пустого указателя, иначе, Ваша хранимая процедура должна была бы использовать другую форму вставки для инициирования значения по умолчанию.
Попробуйте если оператор...
if @value is null
insert into t (value) values (default)
else
insert into t (value) values (@value)
Насколько я знаю, значение по умолчанию только вставляется, когда Вы не определяете значение в операторе вставки. Так, например, необходимо было бы сделать что-то как следующее в таблице с тремя полями (value2 принял значение по умолчанию)
INSERT INTO t (value1, value3) VALUES ('value1', 'value3')
, И затем value2 будет принят значение по умолчанию. Возможно, кто-то вмешается о том, как выполнить это для таблицы с единственным полем.
Можно использовать ОБЪЕДИНИТЬ функцию в SQL MS.
INSERT INTO t (значение) ЗНАЧЕНИЯ (ОБЪЕДИНЯЮТ (@value, 'что-то'))
Лично, я не являюсь сумасшедшим об этом решении, поскольку это - кошмар обслуживания, если Вы хотите изменить значение по умолчанию.
Мое предпочтение было бы предложением Продавцов Mitchel, но это не работает в SQL MS. Не может говорить с другой DBMS SQL.
Вероятно, не большая часть производительности дружественный путь, но Вы могли создать скалярную функцию, которая вытягивает из информационной схемы с именем таблицы и именем столбца, и затем назовите то использование isnull логики, которую Вы попробовали ранее:
CREATE FUNCTION GetDefaultValue
(
@TableName VARCHAR(200),
@ColumnName VARCHAR(200)
)
RETURNS VARCHAR(200)
AS
BEGIN
-- you'd probably want to have different functions for different data types if
-- you go this route
RETURN (SELECT TOP 1 REPLACE(REPLACE(REPLACE(COLUMN_DEFAULT, '(', ''), ')', ''), '''', '')
FROM information_schema.columns
WHERE table_name = @TableName AND column_name = @ColumnName)
END
GO
И затем называют его как это:
INSERT INTO t (value) VALUES ( ISNULL(@value, SELECT dbo.GetDefaultValue('t', 'value') )
Можно использовать значения по умолчанию для параметров хранимых процедур:
CREATE PROCEDURE MyTestProcedure ( @MyParam1 INT,
@MyParam2 VARCHAR(20) = ‘ABC’,
@MyParam3 INT = NULL)
AS
BEGIN
-- Procedure body here
END
, Если @MyParam2 не предоставляется, он сделает, чтобы 'ABC' оценила...
Christophe,
значение по умолчанию на столбце только применяется, если Вы не определяете столбец в операторе 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 для соответствующих столбцов, но честно говоря, я мог бы рассмотреть просто добавление значения по умолчанию к параметрическому усилителю наверху процедуры
Не определяйте столбец или оценивайте при вставке, и значением constaint ПО УМОЛЧАНИЮ заменят отсутствующее значение.
я не знаю, как это работало бы в таблице отдельного столбца. Я имею в виду: это было бы, но это не будет очень полезно.