2010-10-08 20 views
8

Aynı yapıya ve ÇOK BÜYÜK alan sayısına sahip iki tablo var (yaklaşık 1000). 2 işlem yapmam gerekiyor 1) İkinci tablodan tüm satırları yumruğa yerleştirin. Örnek:Sütun adları belirtmeden bir tablo diğerinden nasıl güncellenir?

INSERT INTO [1607348182] 
SELECT * 
FROM _tmp_1607348182; 

2) ikinci tablodaki ilk tablosunun güncellenmesi ama güncelleme için ben güncelleme için uygun sql sözdizimi bulundu olamaz.

sorgular gibi:

Update [1607348182] 
set [1607348182].* = tmp.* 
from [1607348182] 
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid 

veya

Update [1607348182] 
from [1607348182] 
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid 

geçersizdir.

+3

Bunu yapmak zorunda kalmamak için 'TRIGGER' kullanmanızı veya şemanızı değiştirmenizi öneririm. –

+0

Anlamadım. İlk güncellemeden sonra iki tablo aynı satırlar içerecektir, bu yüzden ikinci güncellemenin ne yapacağını umuyorsunuz? – PaulG

+0

Travis G, db şemasını değiştirmeyi kabul ediyorum ama maalesef projemde bu şemayı takip etmeliyim. – amuliar

cevap

3

Değişken güncelleştirme deyimini oluşturmak için bunu dinamik sql kullanmadan gerçekleştirebileceksiniz. Eğer sonuçlarını yüklemek gerekir .... Burada bir döngü önlemek eğer

select name from syscolumns 
where [id] = (select [id] from sysobjects where name = 'tablename') 

emin değil:

Bu ifade size koymak tablo adına göre sütunların listesini döndürür bir imleç içine yukarıda ve daha sonra bir sorgu oluşturun. Psuedo kodlanmış:

sorgu döngü içinde inşa ediliyor yapılır
set @query = 'update [1607348182] set ' 
load cursor --(we will use @name to hold the column name) 
while stillrecordsincursor 
set @query = @query + @name + ' = tmp_[1607348182]. ' [email protected] + ',' 
load next value from cursor 
loop! 

, exec Sp_executesql @query kullanın.

Sadece küçük bir uyarı ... Bu gibi bir döngüde dinamik sql oluşturmak biraz kafa karıştırıcı olabilir. Sorunlu çekim yapmak için, döngüde select @query ifadesini koyarak @query'nin oluşturulmasını izleyin.

düzenleme: Aynı anda tüm 1000 satırı tek bir güncelleştirmede yapabileceğinizden emin değilsiniz ... @query'nin de büyüyebileceği boyutta mantıksal sınırlar var (varchar (8000)?). Kodu, bir seferde 50 sütun tutacak şekilde bölmeniz gerekebilir. Syscolumns select ifadesinden sütunları bir id ile temp tablosuna yerleştirin ve dinamik sql'nizi oluşturun, böylece aynı anda 20 sütun (veya 50?) Güncelleştirin. Bunun bir başka alternatifi de, bunu kütle haline getirmek için excel kullanmak olacaktır. Sütunu seçip sonuçları bir e-tablonun sütununa kopyalayın. Koymak '= sütun b, tmp. [12331312] c sütununda, sütun A'yı sütun D'ye ve sütun e'ye virgül koyun. Tüm elektronik tabloyu bir not defterine kopyalayın ve sizin için oluşturulmuş güncelleme ifadesinin sütunlarına sahip olmalısınız. Bu bir tek atış olayıysa kötü bir çözüm değil, devam eden bir çözüm olarak buna güvenmeme gerek yok.

+0

Bunu yapmak için sql'de hiçbir yerel ifade olmadığı için en iyi çözüm gibi görünüyor. Ayrıca değişken büyüklükteki sütunlarla ilgili SQL Server'ın diğer sınırlamaları ile ilgili sorun vardı.(Ayrıca, sorunlarımın hatalı DB şemasından kaynaklandığını fark ediyorum) Bu yüzden çözümünüz en iyisi gibi görünüyor çünkü bu SQL deyimini önbelleğe alabilir ve daha sonra diğer isteklerde yeniden kullanabilirim. – amuliar

+0

Varchar (8000) sınırlaması hakkında. Yine de varchar (MAX) yaratabilirim – amuliar

+0

İyi bir nokta, son zamanlarda eski veritabanlarında çalışıyorum ve varchar'ı (max) unutmuşum. Zayıf db şemasına ilişkin olarak ... Eski bir şemadan çalıştığınızı sanıyorum (nadiren flatfiles/IDBMS dışındaki numaralar olarak adlandırılan tabloları görüyorum). Eski sistemden normalleştirilmiş bir veritabanına yapılan bir gecelik ithalat, göz önünde bulundurulması gereken iyi bir seçenek olabilir. Aksi halde, yaptığınız her projeye eklenecek bu zayıf şema ile çalışmak için harcanan nispeten büyük bir süreye bakıyorsunuz. – Twelfth

5

Geçici bir kimliğe sahip ana tablodaki her şeyi silmek, daha sonra yeni verilerle birlikte bir ekleme yapmak ister misiniz?

+0

'a ihtiyacım olan iki olası işlemi açıkladım Evet, bu çözümü anladım ve uyguladım. Teşekkürler – amuliar

İlgili konular