Вставьте значение по умолчанию, когда параметр будет пустым

Это обновленный код для findOneAndUpdate. Он работает.

db.collection.findOneAndUpdate(    
  { age: 17 },      
  { $set: { name: "Naomi" } },      
  {
     returnNewDocument: true
  }    
)
40
задан chrisofspades 24 October 2008 в 07:57
поделиться

9 ответов

Корреспондент должен изучить различие между пустым обеспеченным значением и пустым указателем.

Другие отправили правильный основной ответ: обеспеченное значение, включая пустой указатель, что-то , и поэтому оно используется. Значение по умолчанию ТОЛЬКО обеспечивает значение, когда ни один не обеспечивается. Но настоящей проблемой здесь является отсутствие понимания значения пустого указателя.

.

-2
ответ дан Richard T 23 September 2019 в 17:04
поделиться

Самый легкий способ сделать это должно изменить объявление таблицы, чтобы быть

CREATE TABLE Demo
(
    MyColumn VARCHAR(10) NOT NULL DEFAULT 'Me'
)

Теперь в Вашей хранимой процедуре, как которая можно сделать что-то.

CREATE PROCEDURE InsertDemo
    @MyColumn VARCHAR(10) = null
AS
INSERT INTO Demo (MyColumn) VALUES(@MyColumn)

Однако этот метод ТОЛЬКО работает, если бы у Вас не может быть пустого указателя, иначе, Ваша хранимая процедура должна была бы использовать другую форму вставки для инициирования значения по умолчанию.

-2
ответ дан Jesuraja 23 September 2019 в 17:04
поделиться

Попробуйте если оператор...

if @value is null 
    insert into t (value) values (default)
else
    insert into t (value) values (@value)
12
ответ дан Dave DuPlantis 23 September 2019 в 17:04
поделиться

Насколько я знаю, значение по умолчанию только вставляется, когда Вы не определяете значение в операторе вставки. Так, например, необходимо было бы сделать что-то как следующее в таблице с тремя полями (value2 принял значение по умолчанию)

INSERT INTO t (value1, value3) VALUES ('value1', 'value3')

, И затем value2 будет принят значение по умолчанию. Возможно, кто-то вмешается о том, как выполнить это для таблицы с единственным полем.

3
ответ дан chancrovsky 23 September 2019 в 17:04
поделиться

Можно использовать ОБЪЕДИНИТЬ функцию в SQL MS.

INSERT INTO t (значение) ЗНАЧЕНИЯ (ОБЪЕДИНЯЮТ (@value, 'что-то'))

Лично, я не являюсь сумасшедшим об этом решении, поскольку это - кошмар обслуживания, если Вы хотите изменить значение по умолчанию.

Мое предпочтение было бы предложением Продавцов Mitchel, но это не работает в SQL MS. Не может говорить с другой DBMS SQL.

0
ответ дан Paul Osterhout 23 September 2019 в 17:04
поделиться

Вероятно, не большая часть производительности дружественный путь, но Вы могли создать скалярную функцию, которая вытягивает из информационной схемы с именем таблицы и именем столбца, и затем назовите то использование 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') )
2
ответ дан chancrovsky 23 September 2019 в 17:04
поделиться

Можно использовать значения по умолчанию для параметров хранимых процедур:

CREATE PROCEDURE MyTestProcedure ( @MyParam1 INT,
@MyParam2 VARCHAR(20) = ‘ABC’,
@MyParam3 INT = NULL)
AS
BEGIN
    -- Procedure body here

END

, Если @MyParam2 не предоставляется, он сделает, чтобы 'ABC' оценила...

1
ответ дан chancrovsky 23 September 2019 в 17:04
поделиться

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 для соответствующих столбцов, но честно говоря, я мог бы рассмотреть просто добавление значения по умолчанию к параметрическому усилителю наверху процедуры

11
ответ дан chancrovsky 23 September 2019 в 17:04
поделиться

Не определяйте столбец или оценивайте при вставке, и значением constaint ПО УМОЛЧАНИЮ заменят отсутствующее значение.

я не знаю, как это работало бы в таблице отдельного столбца. Я имею в виду: это было бы, но это не будет очень полезно.

0
ответ дан Ian Boyd 23 September 2019 в 17:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: