2013-08-26 81 views
6

我有一個表將動態構建的T SQL查詢存儲在表的列之一中。我的要求是,我需要執行查詢形成(在我的情況下,一些插入語句),我'不想使用一個while循環'來遍歷整個行,然後執行一個變量的語句。另外我不想用光標。該表擁有約500萬個動態形成的SQL插入語句。我以前曾使用while循環嘗試過這種方法,但需要花費數天時間才能完成,因此我放棄了它。執行存儲在表的列中的動態SQL語句

+1

執行500萬個'INSERT'語句需要一些時間。基於集合的方法不可行嗎? –

+1

您有一個可怕的數據模型設計和過度設計的解決方案。 – SQLMason

+0

向我們展示這些數據的一些例子。這是一個非常糟糕的設計,而且很難用性能良好的方式來解決。你最大的希望就是可以將這些數據的大部分縮減爲更多的關係。 – RBarryYoung

回答

4

不得不尋找什麼'十萬」是:)

至於其他意見中提到這並不是DML最優化的方法,請考慮重構。因爲它是可以結合批量動態SQL,例如:

DECLARE @sSQL nvarchar(max) 
SET @sSQL = 'BEGIN TRAN; ' 

SELECT @sSQL = @sSQL + COLUMN_WITH_INSERT_STATEMENT + '; ' 
FROM TABLE 
WHERE [limit number of rows] 

SET @sSQL = @sSQL + 'COMMIT TRAN ' 

EXEC(@sSQL) 

這樣你可以控制的數量INSERT語句合併成一個單一的交易。您可以通過WHERE語句控制插入的數量(例如,WHERE ID BETWEEN 1 and 100一次執行100個INSERT)您可以循環這個條件(是循環,但它不會循環通過單個行,而是通過條件代替eg1 - 100,101-200,201-300等)。

+0

謝謝你的回答。我也嘗試過這種方法。發生在我身上的主要問題是,當我在不同的機器上測試varchar(max)時,它的極限是不一致的。也許,與字符編碼有關。 – Dibin

+0

Nvarchar(max)限制ID 2Gb,從技術上講應該足夠了。你試圖同時運行的語句有多大? –

+0

你可以連接你的exec來超越max。 'exec(@sql + @ sSQL1 + @ sSQL2)' – SQLMason