【问题标题】:SQL INSERT sp_cursor ErrorSQL INSERT sp_cursor 错误
【发布时间】: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


【解决方案1】:

四处搜索以跟进我最初的预感,我找到了一个我认为足够可靠的来源,可以在答案中引用。

指定的 'value' 参数不是您的列之一,它是 sp_cursor 的可选参数,通过您的 INSERT INTO...SELECT 隐式调用。

来自SQL Server Central...

我有一个 ssis 包,需要用数据填充 sql 表 来自一个以竖线分隔的文本文件,每条记录包含 992 (!) 列。 ...最初我会设置包以包含要使用的数据流任务 访问模式设置为表的 ole db 目标控件 或查看模式。但是由于某种原因,当 运行包时 会崩溃,并显示参数“值”无效的错误 在 sp_cursor 过程中。在探查器中设置跟踪以查看 这个控件实际上做了什么它似乎试图插入 使用 sp_cursor 过程记录。在 SQL 中运行相同的查询 Server Management Studio 给出了相同的结果。经过多次测试和 拉出头发,我发现通过更换 sp_cursor 带有插入语句的语句填充的记录很好 表明 sp_cursor 在超过一定数量时无法应对 的参数被尝试。不确定图。

请注意您的情况与所引用的情况之间的共同主题 - 无数列。

同样的来源也提供了一种解决方法。

我已经设法解决了这个问题,但是通过设置访问 模式为“表格或视图 - 快速加载”。再次查看跟踪 确认 SSIS 通过“插入批量”语句尝试此操作 加载正常。

【讨论】:

  • 请原谅我对 SQL 的一点了解。但是如何将访问模式设置为“表格或视图 - 快速加载”?简单搜索后,MSDN 提到可以在 OLE DB 连接管理器/OLE DB 目标编辑器中找到该设置,但我不知道如何访问。
  • 要实现这一点,看起来您将不得不在SSIS package 中完成您的工作。关键是在后台执行INSERT BULK,而不是SP_cursor(产生错误)。根据this MSDN question,无法直接访问它 - 它只能通过批量插入 API 访问。
  • 如何在 SSIS 包中执行它并使用 INSERT BULK?
  • 通过在“数据访问模式”的目标设置中使用“表格或视图 - 快速加载” - 我在这里找到了另一个问题的答案,其中包括 screenshot of how to set it
  • 如何访问 OLE DB 目标编辑器?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多