【发布时间】:2015-06-23 16:40:56
【问题描述】:
我有一对链接的 SQL 服务器:ServerA 和 ServerB。我想编写一个简单的 INSERT INTO SELECT 语句,它将一行从 ServerA 的数据库复制到 ServerB 的数据库。 ServerB 的数据库是直接从 ServerA 复制而来的,因此它们应该具有完全相同的基本结构(相同的列名等)
问题是当我尝试执行以下语句时:
INSERT INTO [ServerB].[data_collection].[dbo].[table1]
SELECT * FROM [ServerA].[data_collection].[dbo].[table1]
我收到以下错误:
Msg 16902, Level 16, State 48, Line 1
sp_cursor: The value of the parameter 'value' is invalid.
另一方面,如果我尝试执行以下语句:
INSERT INTO [ServerB].[data_collection].[dbo].[table1] (Time)
SELECT Time FROM [ServerA].[data_collection].[dbo].[table1]
语句工作正常,代码按预期执行。上面的语句执行得很好,不管我指定要插入哪个或多少个表。
所以我的问题是,为什么我的 INSERT INTO SELECT 语句会在我明确指定要复制的列时正常运行,但当我告诉它使用“*”复制所有内容时却不行?我的第二个问题是:我该如何解决这个问题?
【问题讨论】:
-
通常这表明错误的列是身份列。使用“Value”之类的名称似乎不太可能,但请检查一下,看看 Value 是否是一个身份。此外,请仔细检查两台服务器上的列是否实际上相同。 (在名称、数据类型和顺序方面。)
-
表中没有名为“Value”的列。此外,检查列实际上是否完全相同的最快方法是什么? (有问题的表有 1,000 多列,所以这将非常耗时。)
-
检查this。通过阅读,我认为这与有超过 1,000 列的事实以及 INSERT INTO...SELECT 在后台工作的方式有关,您正在打破最大字符长度。如果我有更好的文档来支持它而不仅仅是一个理论,我会提出这个作为答案。
-
我刚刚快速检查了生成数据的程序 - 它生成了 766 列,而不是我之前假设的 1,000 列以上。
-
我跑了Red Gate对比工具,发现两个数据库一模一样。
标签: sql sql-server-2012 sql-insert insert-into