SQL Server: хотите вставить данные в один столбец, остальные нули: не позволяя мне - PullRequest
2 голосов
/ 22 ноября 2010

Вот мой сценарий:

INSERT INTO
 AP09
SELECT
  cds AS CDSCODE
FROM
  P_Schools
WHERE 
  active = 1;

В таблице AP09 есть десять столбцов.Все кроме первичного ключа (CDSCODE) обнуляются.Я просто хочу вставить CDSCODE из другой таблицы, а остальное по умолчанию равно нулю.Вместо этого я получаю сообщение об ошибке:

SQL Server Database Error: Insert Error: Column name or number of supplied values does not match table definition.

Если я введу правильное количество нулей, вставка работает.Но документация Microsoft гласит (для команды INSERT):

The Database Engine automatically provides a value for the column if the column: 

--Has an IDENTITY property. The next incremental identity value is used.
--Has a default. The default value for the column is used.
--Has a timestamp data type. The current timestamp value is used.
--Is nullable. A null value is used.
--Is a computed column. The calculated value is used.

Кто-нибудь знает, почему это не работает, как рекламируется?Это стоит мне много времени, так как я должен сделать это для нескольких столов!(Это SQL Server 2005 BTW)

Ответы [ 5 ]

7 голосов
/ 22 ноября 2010

Поскольку таблицы AP09 и CDSCODE не имеют одинакового количества столбцов ... необходимо указать столбцы для вставки.Попробуйте что-то вроде этого -

INSERT INTO
 AP09 (Col1)

SELECT
  cds AS CDSCODE 
FROM
  P_Schools
WHERE 
  active = 1;
0 голосов
/ 22 ноября 2010

Поведение и документация правильные.

При выполнении insert into foo select att1, att2... необходимо указать точное количество столбцов в операторе выбора.

Заявление в документации Microsoft о "автоматически«предоставление значения ... для столбцов, допускающих значение NULL» относится к типу оператора вставки ниже, где столбцы вставляемых значений явно перечислены:

INSERT INTO Cities (Location)
VALUES ( 'Chicago' );

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

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

Вы указали один столбец в списке выбора, не указав, в какой из десяти столбцов таблицы он должен быть загружен. SQL не знает, и не будет предполагать, что он может определить, в какой столбец таблицы загрузить его - вам нужно указать, в какой столбец вставить. (Он только «предполагает», если вы указываете столько столбцов, сколько нужно вставить.)

Гадать на SQL и понимать его неправильно было бы намного хуже, чем просто сказать "не знаю". Да, здесь это может показаться легким выбором, но им придется писать алгоритмы, которые работали бы в любой возможной ситуации, а это просто невозможно.

0 голосов
/ 22 ноября 2010
INSERT INTO 
 AP09 (YourTargetColumnName)
SELECT 
  cds AS CDSCODE 
FROM 
  P_Schools 
WHERE  
  active = 1;
0 голосов
/ 22 ноября 2010

Предоставить список столбцов для insert.

insert into foo (col1) select ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...