Почему «INSERT INTO TABLE» не работает, а «INSERT INTO TABLE (VALUES)» работает - PullRequest
0 голосов
/ 22 января 2019

У меня есть большая таблица в одной базе данных, и я хотел бы «скопировать» несколько столбцов в другую таблицу в другой базе данных, обе базы данных на одном сервере (SQL Server 2012). Я создал «целевую» таблицу, используя типы данных и определения из «исходной» таблицы, а затем попытался:

INSERT INTO [MYDB].[dbo].[MYTABLE]
SELECT ColumnA, 
       ColumnB,
       ColumnC,
       ColumnD
FROM [MYotherDB].[dbo].[MYotherTABLE]

Это приводит к ошибке:

Ошибка арифметического переполнения при преобразовании выражения в тип данных nvarchar.

Однако работает следующее. Почему?

INSERT INTO [MYDB].[dbo].[MYTABLE] (ColumnA, ColumnB, ColumnC, ColumnD)
SELECT ColumnA, 
       ColumnB,
       ColumnC,
       ColumnD,
FROM [MYotherDB].[dbo].[MYotherTABLE]

1 Ответ

0 голосов
/ 22 января 2019

Поскольку определения [MYDB].[dbo].[MYTABLE] и [MYotherDB].[dbo].[MYotherTABLE] не совпадают.

При выполнении INSERT псевдонимы / имена столбцов в SELECT не имеют значения для таблицы назначения. Взять, к примеру, эти 2 таблицы:

CREATE TABLE dbo.T1 (C1 int,
                     C2 int);
CREATE TABLE dbo.T2 (C1 int,
                     C2 int);

И давайте поместим некоторые данные в T1:

INSERT INTO dbo.T1 (C1,
                    C2)
VALUES(1,2),(3,4);

Теперь, если мы запустим эти 2 оператора:

INSERT INTO dbo.T2
SELECT C2, C1
FROM T1;

INSERT INTO dbo.T2 (C2,C1)
SELECT C2, C1
FROM T1;

Как вы думаете, эти два утверждения идентичны? если так, то вы ошибаетесь:

SELECT *
FROM T2;

Обратите внимание, что значения (из первого оператора) «переключаются». Это потому, что первое утверждение было эквивалентно:

INSERT INTO dbo.T2 (C1,C2)
SELECT C2, C1
FROM T1;

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

CREATE TABLE dbo.T3 (C2 int,
                     C1 int);

INSERT INTO dbo.T3
SELECT C1, C2
FROM T1;

SELECT *
FROM dbo.T3

Мы не знаем определения ваших таблиц, но причина та же. Решение: всегда явно указывайте столбцы при использовании INSERT.

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