为什么“ INSERT INTO TABLE”失败,但“ INSERT INTO TABLE(VALUES)”有效

时间:2019-01-22 16:02:45

标签: sql-server insert

我在一个数据库中有一个大表,并且想将少数列“复制”到另一个数据库中的另一个表中,两个数据库都位于同一服务器上(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 :(得分:1)

因为[MYDB].[dbo].[MYTABLE][MYotherDB].[dbo].[MYotherTABLE]的定义不同。

执行INSERT时,SELECT中列的别名/名称对目标表毫无意义。以下面两个表为例:

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时,务必明确定义列。