2009-12-02 14 views
5

Tablo değerli işlev çağrısı için varsayılan anahtar sözcük nasıl iletilir? Veritabanımızda, okuyucumuzun güvenlik ve modülerlik amaçları için, tablo değerli fonksiyonlardaki çoğulları (örneğin, seçilmiş ifadeler) sarıyoruz. Bu yüzden bir veya daha fazla isteğe bağlı parametreyi tanımlayan bir TVF var. Ben temerrüde parametrelerle bir TVF sahip inanıyoruzADO.NET

anahtar kelime default kullanımını zorunlu kılan şöyle TVF çağrılırken:

gayet
select * from fn_SampleTVF(123, DEFAULT, DEFAULT) 

, her şey sorgu analizörü çalışır, ama aslında zamanı geldiğinde Bu isteği ADO.NET'ten yapmak, aslında default sözcüğünü işlenen sql'e koyan bir sql parametresi nasıl oluşturacağımı bilmiyorum.

String qry = "select * from fn_SampleTVF(@requiredParam, @optionalParam)"; 

DbCommand command = this.CreateStoreCommand(qry, CommandType.Text); 

SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int); 
someRequiredParam.Value = 123; 
command.Parameters.Add(someRequiredParam); 

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = >>>> WTF? <<<< 
command.Parameters.Add(optionalParam); 

Yani, herkes herhangi bir fikir nasıl TVF için default geçmek var:

Şimdi kabaca böyle bir şey var?

+1

En çözüm varsayılan maddeleri kullanarak kaçınmaktır TVF parametresi tanımı, Kevin'in önerdiği gibi boş değerlere geçme ve TVF gövdesinde varsayılan ayarları manuel olarak oluşturma. İşte bulduğum bir yazı (Sprocs ile ilgili, fakat sorun aynı). Microsoft ile ilişkili tüm diğer şeyler gibi http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/3825fe1c-7b7e-4642-826b-ea024804f807 , bu bir buçuk içerecektir işe alma -bakmış geçici çözüm. – Mason

cevap

0

Boş değeri parametre değeri olarak geçirebilirsiniz.

Bu makale

örnekler gösterilmektedir: Varsayılan için (isteğe bağlı parametre) kodunun üzerinde eklemek gerekmez http://support.microsoft.com/kb/321902

+0

Bunu deneyeceğim, ama kesin bir boşluğun aktarılmasının, TVF tanımında tanımlanan varsayılanları geçersiz kılacağı ve varsayılanların işe yaramayacağı konusunda kesin olarak eminim. – Mason

+0

Bulgularınızı duymak isterim. Bu soruyu görmeden önce bunu bilmem gerekmediğini görünce çok şaşırdım. Hala Null'un çalışmasını beklerdim ve DBNull paramaterin tanımını geçersiz kılar. –

+0

Evet, sadece kontrol ettim, bu iyi değil. Ve nedeni arasında bir fark var çünkü: select * fn_SampleTVF (123, DEFAULT) den ve select * Yine de teşekkürler (123, null) fn_SampleTVF dan. – Mason

3
SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = >>>> WTF? <<<< 
command.Parameters.Add(optionalParam); 

. SQL Server, UDF'nizde tanımlandığı gibi varsayılanı kullanır. Eğer farklı bir değer geçmek istiyorum Ancak eğer o zaman geçirebilirsiniz:

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = newValue; 
command.Parameters.Add(optionalParam); 
+0

Ayrıca, (şu ana kadar yaptığım testlerden) veri tipini belirtmeniz bile gerekmiyor; Yani şöyle diyebilirsiniz: command.Parameters.Add (yeni SqlParameter ("@ OptionalParam", null)); ...ve [null] [varsayılan] olarak yorumlanır – tbone

+1

DÜZENLEME: önceki yorumum yanlış: [null] ** değil ** [varsayılan] olarak yorumlandı – tbone

+0

Tamam, daha da fazla test ettikten sonra, en azından geçerli çerçeve sürümü ile Kullanıyorum, bir değer belirtmeden parametrenin eklenmesi kullanılmakta olan varsayılan değer ile sonuçlanmıyor. Https://msdn.microsoft.com/en-us/library/system.data: Burada [varsayılan] ile SSMS'den çağrı, parametrenin hiçbir değer içermemesi ile aynı sonucu vermez. sqlclient.sqlparameter.value% 28v = vs.110% 29.aspx – tbone

1

Öyle yapardı: Öyle-kadar gördüğüm

public void YourMethod(int rparam, int? oparam = null) 
{ 
    String qry = string.Format("select * from fn_SampleTVF(@requiredParam, {0})" 
     , !oparam.HasValue ? "default" : "@optionalParam"); 

    SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int); 
    someRequiredParam.Value = rparam; 
    command.Parameters.Add(someRequiredParam); 

    if (oparam.HasValue) 
    { 
     SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
     optionalParam.Value = oparam.Value; 
     command.Parameters.Add(optionalParam); 
    } 
}