2008-08-26 9 views
1

Ben (değil bir KİMLİK türü olsa da, sadece düz ol' int) o birkaç farklı tablolar arasında aslında benzersiz sütunlardan biri benzersiz bir tanımlayıcı yer (şu anda binlerce numaralandırma INSERT deyimleri ile) veri ekler SQL komut dosyası var .SQL Server UDF çağrıları arasında durumu koruyabilir miyim?

sonraki müsait kimliğini alır senaryoma (yani son kullanılan kimlik + 1) için bir skaler işlev eklemek istiyorum ama bir yol olarak görünmüyor çünkü bu mümkün olduğundan emin değilim Bir UDF içinden global veya statik değişken kullanın, geçici tablo kullanamıyorum ve kalıcı bir tabloyu işlev içinden güncelleyemiyorum.

 
    declare @v_baseID int 
    exec dbo.getNextID @v_baseID out --sproc to get the next available id 
    --Lots of these - where n is a hardcoded value 
    insert into tableOfStuff (someStuff, uniqueID) values ('stuff', @v_baseID + n) 
    exec dbo.UpdateNextID @v_baseID + lastUsedn --sproc to update the last used id 

Ama böyle bakmak istiyorum:

Şu benim script şöyle bir baş belası olduğunu ofset ve bir hata eğilimli hardcoding

 
    --Lots of these 
    insert into tableOfStuff (someStuff, uniqueID) values ('stuff', getNextID()) 

. Basit bir skaler fonksiyona dönüştürmek çok cazip, ancak bu şekilde yapılamayacağını düşünmeye başladım çünkü aramalar arasındaki ofset sayacını korumanın bir yolu yok gibi görünüyor. Bu doğru mu, yoksa kayıp olduğum bir şey var mı?

Şu anda SQL Server 2005 kullanıyoruz. açıklama için

düzenlemeler: bu olmayacak isabet

İki kullanıcı. Bu sadece bir kez çalıştırılacak bir yükseltme komut dosyası ve aynı zamanda asla.

gerçek sproc

, sp_who ile başlayan örnek kod sabit değildir.

Normal kullanımda kimlikleri gerektiği gibi almak için bir kimlik tablosu ve bir spkayı kullanıyoruz, bu betikte bunu yapmanın daha temiz bir yolunu arıyordum, bu da aslında bir sürü veriyi db'ye döküyor.

cevap

2

Aramalar arasındaki ofset sayacını korumanın bir yolu olmadığı için bu şekilde yapılamayacağını düşünüyorum. Bu doğru mu, yoksa kayıp olduğum bir şey var mı?

Hiçbir şey kaçırmıyorsunuz; SQL Server, global değişkenleri desteklemez ve UDF'ler içindeki veri değişikliklerini desteklemez. Ve CONTEXT_INFO (bkz. http://weblogs.sqlteam.com/mladenp/archive/2007/04/23/60185.aspx) kullanarak kludgy olarak bir şey yapmak isteseniz bile, bunu bir UDF içinden yine de ayarlayamazsınız.

Ofsetin "kodlaması" nı, bir değişkeni ve yinelemeyi yineleyerek, bu döngü içindeki ekleri yaparak elde etmenin bir yolu var mı?

2

aynı anda vurarak 2 kullanıcılar varsa bunlar aynı kodu oluşturulacaktır. bunun yerine bir kimlikle bir kimlik tablo kullanmak vermedi Neden, bu içine yerleştirin ve (garanti) id, bu da

sp_getNextID çok daha hızlı gerçekleştirecek benzersiz olarak kullanıp

hiçbir zaman sp_ ile proxy'leri önbelleğe almayın, bu, performansın bir sonucu anlamına gelir çünkü optimizatör ilk önce bu DB'nin orada olup olmadığını ve sonra yerel DB'yi görmek için ana DB'yi denetler, ayrıca MS bir hizmet paketinde sp_getNextID oluşturmaya karar verirse sizinki asla Yürütülecek

0

Muhtemelen değerinden daha fazla iş olurdu, ancak bir SQL CLR UDF'de statik C#/VB değişkenlerini kullanabilirsiniz, bu yüzden her seferinde bu değişkeni artırarak yapmak istediğiniz şeyi yapabileceksiniz. UDF denir. Tabii ki, uygulama alanı kaldırıldığında statik değişken kaybolacaktır. Yani kimliğinizin sürekliliğine bir günden diğerine ihtiyacınız varsa, en yüksek değeri bulmak için, bu kimliği kullanan tüm tabloları yoklamak için NextId'in ilk erişiminde bir yolun olması gerekir.