當前我們導入一個表Import_File,其中有一個具有分隔值的選項列。 我們需要將這些分隔值加載到不同的表格中。將MSSQL批量字符串插入到XML中
目前,我們這樣做,在這往往是由於行數較慢一次一行能100K +
有沒有一種方法,以低於加快代碼?
Declare @InvId uniqueidentifier
Declare @xml xml
Declare CurrFeatureList Cursor For
Select
import.InventoryId,
N'<root><r><![CDATA[' + replace(import.OPTIONS ,',',']]></r><r><![CDATA[') + ']]></r></root>'
From Import_File import with (nolock)
Where
import.options IS NOT NULL
And ISNULL(import.IsFeatureProcessed,0) = 0
And LEN(ISNULL(import.OPTIONS,''))>10
And import.InventoryId Is Not Null
OPEN CurrFeatureList
FETCH NEXT FROM CurrFeatureList
INTO @InvId, @xml
Print 'Inventory Import #10000'
Print GetDate()
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
Insert Into Import_File_Feature
(
FeatureId,
InventoryId,
FeatureText,
FeatureGroup,
FeatureCategory,
FeatureIsAvailable,
FeatureIsStandard
)
Select
NEWID(),
@InvId,
t.value('.','varchar(250)'),
'',
'',
1,
1
From @xml.nodes('//root/r') as a(t)
FETCH NEXT FROM CurrFeatureList
INTO @InvId, @xml
END TRY
BEGIN CATCH
Print 'Error '
Print @InvId
Print ERROR_NUMBER()
Print ERROR_SEVERITY()
Print ERROR_STATE()
Print ERROR_PROCEDURE()
Print ERROR_LINE()
Print ERROR_MESSAGE()
FETCH NEXT FROM CurrFeatureList
INTO @InvId, @xml
END CATCH
END
Close CurrFeatureList
Deallocate CurrFeatureList
GO
似乎遊標可以替換爲'INSERT INTO SELECT' ... –
同意@Rigerta。你沒有在光標中做任何需要光標的東西。 –
是的,但我無法弄清楚如何在單個語句中執行select/join。理論上是的,這聽起來像是正確的方法,但我沒有玩過很多XML,所以不知道如何製作SQL。關於從哪裏開始的任何建議? – ullfindsmit