Вставьте пустую строку в столбец INT для SQL Server

Таблица SAMPLE имеет только один столбец ID типа int, по умолчанию нулевой.

В Oracle, когда я делаю:

  insert into SAMPLE (ID) values ('');

новая запись добавляется с пустым значением. Но в SQL Server 2008, когда я запускаю тот же оператор insert, новая запись имеет значение 0.

Есть ли способ заставить SQL Server 2008 использовать пустую строку по умолчанию для NULL вместо 0 (для числового типа столбцов)?


person user1793297    schedule 02.11.2012    source источник


Ответы (5)


Предполагая, что ваш оператор INSERT является частью хранимой процедуры, повторно используемой во многих местах вашего приложения (или, возможно, представляет собой пакет, всегда создаваемый одной и той же частью клиентского кода) и что вставляемое значение является числом, переданным как строковый аргумент, вы можете изменить INSERT следующим образом:

INSERT INTO SAMPLE (ID) VALUES (NULLIF(@argument, ''));
person Andriy M    schedule 02.11.2012

Вместо этого используйте NULL.

insert into SAMPLE (ID) values (NULL);
person Mikael Eriksson    schedule 02.11.2012
comment
Я знаю, что NULL будет работать. Но мне нужно изменить МНОГО кода, который отлично работает с Oracle, не говоря уже о МНОГОм тестировании. :( - person user1793297; 02.11.2012
comment
Я не думаю, что вы можете сделать это без изменения кода. Я не знаю ни одного параметра, который заставит SQL Server рассматривать пустую строку как NULL. - person Mikael Eriksson; 02.11.2012

Как насчет другой идеи - определить триггер INSTEAD OF INSERT. .

Несмотря на то, что вы пытаетесь вставить строку, при этом операция «перехватывается», пустая строка заменяется на NULL, и вставка завершается успешно.

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

Редактировать: Как указывает Мартин Смит, это фактически сравнение с 0 (эквивалент пустой строки как int), что означает, что вы не сможете сохранить 0 в этой таблице. Я оставляю этот ответ здесь на случай, если это приемлемо для вашей ситуации - либо это, либо повторите все ваши запросы!

CREATE TRIGGER EmptyStringTrigger
ON [SAMPLE]
INSTEAD OF INSERT
AS
  BEGIN
      INSERT INTO [SAMPLE](ID)
      SELECT CASE
               WHEN ID = '' THEN NULL
               ELSE ID
             END
      FROM   inserted
  END

пример скрипта SQL

person Bridge    schedule 02.11.2012
comment
Это также преобразует все нули в NULL. Сначала происходит приведение пустой строки к нулю, так что ID в inserted является правильным типом данных, затем ваше сравнение WHEN ID = '' THEN NULL выполняет еще одно неявное приведение от '' к 0 для строкового литерала, поэтому вы эффективно выполняете WHEN ID = 0 THEN NULL - person Martin Smith; 02.11.2012
comment
@MartinSmith Хорошо, я этого не заметил. Я не могу придумать способ обойти это. Я оставлю этот ответ здесь на случай, если это в любом случае приемлемо для ситуации OP. - person Bridge; 02.11.2012
comment
@MartinSmith Я отредактировал, чтобы включить вашу точку зрения. И тут мне стало интересно, почему никто другой не предложил это, если это было так просто! Спасибо за вашу ценную информацию, как всегда. - person Bridge; 02.11.2012

Вы не можете вставить «строку» в столбец int. Oracle должен просто справиться с этим для вас.

Просто попробуйте вставить NULL, если это то, что вам нужно.

insert into SAMPLE (ID) values (NULL);
person Jarod Elliott    schedule 02.11.2012
comment
вставить в SAMPLE (ID) значения ('5'); Я получаю ID = 5, Oracle и SQL-сервер делают одну и ту же вставку в значения SAMPLE (ID) (''); Я получаю ID = 0 для SQL-сервера и '' для Oracle - person user1793297; 02.11.2012
comment
Я считаю, что в Oracle пустые строки и Null являются синонимами. - person Martin Smith; 02.11.2012

еще один вариант

insert into SAMPLE (ID) values (DEFAULT)
person Aleksandr Fedorenko    schedule 02.11.2012