将一个表复制到另一个表失败 - “每个表中的列名必须是唯一的”

时间:2009-12-22 11:16:59

标签: sql-server

当我尝试这个时:

SELECT * 
-- INTO DB2.dbo.CustomerOrderLines
FROM DB1.dbo.CustomerOrderLines 
INNER JOIN DB1.dbo.CustomerOrders ON DB1.dbo.CustomerOrders.Order_Display_Ref = DB1.dbo.CustomerOrderLines.Order_Display_Ref
WHERE DB1.dbo.CustomerOrders.Delivered_Date BETWEEN '2009-09-23' and '2009-09-24'

正确显示行。

当我尝试将DB1中的一个表中的内容复制到DB2中的同一个表中时(如果它不存在则创建它):

SELECT * 
INTO DB2.dbo.CustomerOrderLines
FROM DB1.dbo.CustomerOrderLines 
INNER JOIN DB1.dbo.CustomerOrders ON DB1.dbo.CustomerOrders.Order_Display_Ref = DB1.dbo.CustomerOrderLines.Order_Display_Ref
WHERE DB1.dbo.CustomerOrders.Delivered_Date BETWEEN '2009-09-23' and '2009-09-24'

它以

失败

Msg 2705,Level 16,State 3,Line 1 每个表中的列名必须是唯一的。表'CustomerOrderLines'中的列名'Order_Display_Ref'被多次指定。

SELECT * INTO和INSERT INTO SELECT *在将其他表从一个数据库复制到另一个数据库时工作正常,但它们不使用JOINS。

我的错误是什么?

6 个答案:

答案 0 :(得分:4)

您想将DB1.dbo.CustomerOrderLines的内容添加到DB2.dbo.CustomerOrderLines吗?

然后,告诉SELECT中的SQL Server,您只需要该表的内容。

SELECT DB1.dbo.CustomerOrderLines.* 
INTO DB2.dbo.CustomerOrderLines
FROM DB1.dbo.CustomerOrderLines 
INNER JOIN DB1.dbo.CustomerOrders ON DB1.dbo.CustomerOrders.Order_Display_Ref = DB1.dbo.CustomerOrderLines.Order_Display_Ref
WHERE DB1.dbo.CustomerOrders.Delivered_Date BETWEEN '2009-09-23' and '2009-09-24'

答案 1 :(得分:2)

您正在连接两个表,其中包含此Order_Display_Ref列。看起来您只需要来自CustomerOrderLines的数据,所以我会这样做:

SELECT DB1.dbo.CustomerOrderLines.* 
INTO DB2.dbo.CustomerOrderLines
FROM DB1.dbo.CustomerOrderLines 
INNER JOIN DB1.dbo.CustomerOrders ON DB1.dbo.CustomerOrders.Order_Display_Ref = DB1.dbo.CustomerOrderLines.Order_Display_Ref
WHERE DB1.dbo.CustomerOrders.Delivered_Date BETWEEN '2009-09-23' and '2009-09-24'

答案 2 :(得分:1)

CustomerOrderLinesCustomerOrders似乎有一个或多个名称相同的列,例如CustomerOrderLines.IdCustomerOrders.Id会导致此类冲突,因为您的查询会尝试创建两个名为Id的列。

注意:至少有一个问题来自列Order_Display_Ref,它出现在这两个表中。可能会有更多。

答案 3 :(得分:1)

DB1上的两个表都有Order_Display_Ref列,所以它试图插入两次。只需提供一个列列表而不是*,它应该可以正常工作。

答案 4 :(得分:1)

您正在将DB1表连接到自身并选择所有结果列。这将意味着所有列名都重复。

您需要指定要插入的来源:

SELECT DB1a.* 
INTO DB2.dbo.CustomerOrderLines
FROM DB1.dbo.CustomerOrderLines DB1a 
INNER JOIN DB1.dbo.CustomerOrders DB1b
  ON DB1.dbo.CustomerOrders.Order_Display_Ref = DB1.dbo.CustomerOrderLines.Order_Display_Ref
WHERE DB1.dbo.CustomerOrders.Delivered_Date BETWEEN '2009-09-23' and '2009-09-24'

答案 5 :(得分:0)

或者只是重命名具有相同名称的列。

SELECT

TableA.Column1,
TableA.Column1,
TableA.Column2,
TableA.Order_Display_Ref,
TableB.Order_Display_Ref as TableBOrder_Display_Ref,
TableB.ColumnN

INTO DB2.dbo.CustomerOrderLines
FROM DB1.dbo.CustomerOrderLines 
INNER JOIN DB1.dbo.CustomerOrders 
ON DB1.dbo.CustomerOrders.Order_Display_Ref = DB1.dbo.CustomerOrderLines.Order_Display_Ref
WHERE DB1.dbo.CustomerOrders.Delivered_Date BETWEEN '2009-09-23' and '2009-09-24'