2012-01-23 34 views
2

我目前正在使用的應用程序將生成一個SQL腳本來填充數據庫。在腳本中的單個交易看起來是這樣的(注意:我已經改變了表/變量名;-)超過SQL Server 2005腳本中變量聲明的最大數量

USE MyDatabase 

BEGIN TRANSACTION 

SET XACT_ABORT ON 
DECLARE @Foo int 

SET IDENTITY_INSERT Table1 ON 
INSERT INTO Table1 [...] 
SET IDENTITY_INSERT Table1 OFF 

SET IDENTITY_INSERT Table2 ON 
INSERT INTO Table2 [...] 
SET IDENTITY_INSERT Table2 OFF 

INSERT INTO Table3 [...] 

-- Here I reference @Foo 
SET @Foo = dbo.SomeStoredProcedure() 
-- Use @Foo in some query 

COMMIT TRANSACTION 

GO 

SET NOCOUNT ON 

這個腳本然後會產生這些交易的n,然後將這個SQL Server 2005上excuted填充數據庫與n記錄。

我看到的問題是上面顯示的變量@Foo的聲明。當運行腳本,一旦我們達到了65535條記錄,我得到以下錯誤:

The variable name '@Foo' has already been declared. 
Variable names must be unique within a query batch or stored procedure. 

我認爲這是一個誤導性的錯誤消息,因爲一切都很好,直到我打了65535,並且這個數字的意義( 2^16-1)導致我相信我遇到某種腳本限制。

我曾嘗試在腳本的頂部定義一次@Foo變量,並在每次事務中重新使用它。但是這不起作用,因爲每個交易都有其自己的範圍。

會創建一個額外的範圍級別(即一個內部事務)並在深層範圍內聲明該變量幫助解決此問題?

有關解決此問題的最佳方法的其他建議?

+0

無論生成這些腳本是否會觸及限制而不是SQL Server - 例如,如果你檢查腳本,#65535看起來是否與以前一樣?另外,如果你打這樣的限制,這個過程是否仍然有意義?您是否考慮過其他選項來導入這些數據? –

回答

1

看起來你已經錯過了GO分隔符,因爲我有很多更多行腳本。檢查您的腳本解決方案

+0

你能否詳細說明一下?我想執行每個批次(在每個'GO'語句之間)一次,所以不知道這對我有什麼幫助。 – LeopardSkinPillBoxHat

+0

你可以創建腳本,而不是運行它,但檢查?嘗試從SSMS運行它 - 並在出現錯誤的情況下,它會指向錯誤行 –

+0

腳本爲170MB,當我嘗試在SSMS中打開它時,出現錯誤「操作無法完成」。看起來我不是第一個體驗這個的人:http://connect.microsoft.com/SQLServer/feedback/details/269566/sql-server-management-studio-cant-handle-large-files – LeopardSkinPillBoxHat

-1

嘗試Go定界符並更改dynmc的數據類型。變量。您將不再使用它的範圍,並且「INT」是SQL Server中的循環數據類型。當-65536到65535的週期完成時,它將到達相同的地址。

+0

'int'在SQL Server中是4個字節,所以不能解釋它爲什麼在65535打包:http://msdn.microsoft.com /en-us/library/ms187745.aspx – LeopardSkinPillBoxHat

+0

你能解釋一下「GO」分隔符的含義嗎?我錯過了什麼? – LeopardSkinPillBoxHat