SQL Server: конвертировать пустые значения в значения при вставке не удается - могу ли я форсировать это? - PullRequest
2 голосов
/ 13 ноября 2010

Я пытаюсь добавить NOT NULL и DEFAULT в существующую таблицу.

Для этого я использую переходную таблицу для заполнения любых значений NULL.

Таблица 1 имеет столбец NULL, Таблица 2 имеет улучшенный дизайн.

CREATE TABLE table1 (
    CustomerID INT
  , CartID NULL);

CREATE TABLE table2 (
    CustomerID INT
  , CartID NOT NULL DEFAULT NEWID());

INSERT INTO table2 (CustomerID, CartID)
SELECT CustomerID, CartID = CASE CartID WHEN NULL THEN NEWID() ELSE CartID END
FROM table1;

Я по-прежнему получаю сообщение об ошибке «Невозможно вставить значение NULL в столбец», хотя каждое значение NULL заполняется новым значением в инструкции SELECT.

Как я могу сделать эту работу?

Ответы [ 3 ]

6 голосов
/ 13 ноября 2010

In SQL, NULL не равно NULL (и тоже не равно).

«Есть ли у собаки природа будды или нет?»
"NULL"

Вот почему CASE var WHEN NULL THEN … никогда не добьется успеха.

Используйте это:

CASE WHEN CartID IS NULL THEN NEWID() ELSE CartID END

или просто так:

COALESCE(CartID, NEWID())
1 голос
/ 13 ноября 2010

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

  1. Изменить таблицу, чтобы разрешить ноль,
  2. Обновить таблицу новыми идентификаторами, где ноль,
  3. Снова измените таблицу с ненулевым ограничением и значением по умолчанию.

Это сработало бы только в том случае, если никто не использовал таблицу, поэтому ответ Кассной предпочтительнее.

0 голосов
/ 13 ноября 2010

Вы можете изменить код на следующее:

INSERT INTO table2 (CustomerID, CartID)
SELECT CustomerID, COALESCE(CartID, NEWID())
FROM table1;
...