我在一个数据库中有一个大表,并且想将少数列“复制”到另一个数据库中的另一个表中,两个数据库都位于同一服务器上(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]
答案 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
时,务必明确定义列。