2015-06-23 69 views
1

我有一對鏈接的SQL Server:ServerA和ServerB。我想寫一個簡單的INSERT INTO SELECT語句,它將從ServerA的數據庫複製一行到ServerB的數據庫。 ServerB的數據庫是直接從服務器A的複製,所以他們應該有相同的基本結構(相同的列名等)SQL INSERT sp_cursor錯誤

的問題是,當我嘗試執行以下語句:

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語句正常工作,但當我告訴它使用「*」複製所有內容時,不能正常工作?我的第二個問題是:我該如何解決這個問題?

+0

通常這表示錯誤的列是標識列。用一個像「價值」這樣的名字,這看起來不太可能,但檢查一下,看看價值是否是一種身份。另外,請仔細檢查兩臺服務器上的列是否相同。 (名稱,數據類型和順序)。 – DeadZone

+0

表中沒有名爲「Value」的列。另外,檢查列實際上是完全相同的最快捷的方法是什麼? (有問題的表格有1000多列,所以這會非常耗時。) – Karasu

+0

檢查[this](http://www.kepware.com/KEP_KB/?solution=/_ui/selfservice/pkb/PublicKnowledgeSolution/d?&id = 50140000000SUKxCsY)out。從閱讀的角度來看,我認爲它與超過1000個列以及INSERT INTO ... SELECT在引擎蓋下工作的方式有關,因此您打破了最大字符長度。如果我有更好的文檔來支持它,而不僅僅是理論,我會提出這個答案。 – LDMJoe

回答

0

谷歌搜索跟隨我的最初預感,我發現一個來源我認爲可靠足以引用答案。

指定的'value'參數不是您的列之一,它是通過您的INSERT INTO ... SELECT隱式調用的sp_cursor的可選參數。

SQL Server Central ...

I have an ssis package that needs to populate a sql table with data from a pipe-delimited text file containing 992 (!) columns per record. ...Initially I'd set up the package to contain a data flow task to use an ole db destination control where the access mode was set to Table or view mode. For some reason though, when running the package it would crash, with an error stating the parameter 'value' was not valid in the sp_cursor procedure. On setting up a trace in profiler to see what this control actually does it appears it tries to insert the records using the sp_cursor procedure. Running the same query in SQL Server Management Studio gives the same result. After much testing and pulling of hair out, I've found that by replacing the sp_cursor statement with an insert statement the record populated fine which suggests that sp_cursor cannot cope when more than a certain number of parameters are attempted. Not sure of the figure.

注意這裏的情況和一之間的共同主題引用 - 一個bazillion列。

同樣的來源也提供瞭解決方法。

I've managed to get round this problem however by setting the access mode to be "Table or view - fast load". Viewing the trace again confirms that SSIS attempts this via a "insert bulk" statement which loads fine.

+0

請原諒我對SQL的小知識。但是如何將訪問模式設置爲「表或視圖 - 快速加載」?在簡短的搜索之後,MSDN提到可以在OLE DB連接管理器/ OLE DB目標編輯器中找到該設置,但我不知道如何訪問該設置。 – Karasu

+0

爲了解決這個問題,您需要在[SSIS包](https://msdn.microsoft.com/en-us/library/ms141134.aspx)中完成您的工作。關鍵是在引擎蓋下正在執行'INSERT BULK',而不是'SP_cursor'(它正在產生錯誤)。根據[這個MSDN問題](https://social.msdn.microsoft.com/Forums/sqlserver/en-US/d9bf8677-7138-457a-afae-948ae749465e/what-is-insert-bulk?forum=transactsql)無法直接訪問它 - 只能通過批量插入API訪問它。 – LDMJoe

+0

如何在SSIS包中執行它並使用INSERT BULK? – Karasu