2013-08-26 21 views
6

Dinamik olarak oluşturulmuş T SQL sorgularını tablonun sütunlarından birinde depolayan bir tablom var. Benim gereksinimim (benim durumumda, bazı ekleme deyimleri) oluşan sorguyu yürütmek ve I 'tüm satırları çaprazlamak ve sonra bir değişkenden ifadeleri yürütmek için bir süre döngü' kullanmak istemiyorum. Ayrıca Bir imleç kullanmak istemiyorum. Tabloda yaklaşık 5 milyon dinamik olarak oluşturulmuş SQL eklentisi vardır. Daha önce bu şeyi bir süre döngü kullanarak denedim, ancak tamamlanması için günlerimi alıyordum ve ben de düşürdüm.Bir tablonun bir sütununda saklanan dinamik bir SQL deyimi yürütme

+1

5 milyon INSERT ifadesinin yürütülmesi biraz zaman alacaktır. Set tabanlı bir yaklaşım mümkün değil mi? –

+1

Korkunç bir veri modeli tasarımınız var ve bir probleme aşırı tasarlanmış bir çözüm var. – SQLMason

+0

Bize bu verinin bazı örneklerini göster. Bu çok kötü bir tasarımdır ve iyi performans gösteren bir şekilde ele alınması son derece zordur. En iyi umudunuz, bu verilerin çoğunun daha ilişkisel bir şeye indirgenebilmesidir. – RBarryYoung

cevap

4

'neyi `lakh aramak zorunda diğer yorumlar bu, yeniden düzenleme düşünün lütfen DML en optimal yaklaşım değildir belirtildiği gibi

:) oldu. Olduğu gibi gruplar halinde dinamik SQL, ör .:

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) 

tek işlemde içine INSERT tabloların kontrollü sayıda birleştirebilirsiniz Bu şekilde bir arada kullanabilirsiniz. WHERE ifadesi ile eklerin sayısını kontrol edebilirsiniz (örn. 100 INSATT'ı bir seferde yürütmek için WHERE ID BETWEEN 1 and 100). Bu koşula dönüş yapabilirsiniz (evet döngüsü, ancak bu satırlar tek tek satırlarla değil, örn. 100, 101 - 200, 201 - 300 vb.

+0

Cevabınız için teşekkür ederiz. Bu yöntemi de denedim. Benim için ortaya çıkan asıl sorun, farklı makinelerde test ettiğimde varchar (max) limitindeki tutarsızlıktı. Belki karakter kodlamasıyla ilgili bir şey. – Dibin

+0

Nvarchar (max) limit 2Gb'yi, teknik olarak yeterli olması gerekir. İfadeleri bir seferde nasıl çalıştırmaya çalışıyorsunuz? –

+0

Max'in ötesine geçmek için exec'nizde birleşik olabilirsiniz. exec (@sSQL + @ sSQL1 + @ sSQL2) – SQLMason

İlgili konular