2011-11-08 12 views
14

Ben 2100 parametre sınırını vurduğunda sorgular durdurma bir SqlCommand farklı sorguları topluyorum. Eğer toplu işimde 2100 veya 2099 parametresi varsa, yine de istisna yapıyorum. http://msdn.microsoft.com/en-us/library/ms143432.aspx Ben muktedir bekliyordum: Aşağıdaki test kodu parametrelerinin sayısı az 2100.SqlCommand maksimum parametre istisnası 2099 parametrelerinde

var parametersMax = 2099; 

var connection = new SqlConnection(@"Data Source=.;Integrated Security=SSPI;"); 
connection.Open(); 

var enumerable = Enumerable.Range(0, parametersMax); 

var query = string.Format("SELECT {0}", String.Join(", ", enumerable.Select(s => string.Format("P{0} = @p{0}",s)))); 

var command = new SqlCommand(query, connection); 

foreach(var i in enumerable) 
    command.Parameters.Add(string.Format("p{0}",i), i); 

// here: command.Parameters.Count is 2099 

var reader = command.ExecuteReader(); // throws: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Too many parameters were provided in this RPC request. The maximum is 2100. 

istisna mesajı ve burada belgeleri dikkate alındığında bile 'çok fazla parametre istisna' atar

Bir sorguda 2100 parametresi var, ancak bu doğru görünmüyor. Nedenini bilen var mı? Bir şey mi eksik?

SQL Server gönderilen

+3

Bu çok sayıda parametreyi ne için kullanıyorsunuz? Bunun yerine tablo değerli bir parametre kullanmayı düşündünüz mü? –

+0

2098/2097/etc ile çalışır. SQL'in varsayılan olarak sahip olduğu bir ReturnValue parametresi olduğunu düşünüyorum. –

+0

Bunu tasarımla kullanamıyorum, sorguları birden çok toplu işlemde bölme konusunda iyiyim. Sadece neden 2100 parametreyi kullanamadığımı bilmek istedim. – marcob

cevap

19

komut sp_executesql parametre çağrısında yuvalarının 2 NVARCHAR dizeleri ile kabul edilirken,

exec sp_executesql 
      N'SELECT P0 = @p0, P1 = @p1, P2 = @p2...', 
      N'@p0 int,@p1 int,@p2 int...', 
      @p0=0,@p1=1,@p2=2... 

Not (Ben SQL Server 2008 R2 kullanıyorum) sorgu metni ve parametre tanımları için "yalnızca" 2,098'i kullanmanız için ücretsiz olarak kullanabilirsiniz.

+1

Bu hatanın önündeydim (Bu EXECUTE ifadesinde çok fazla parametre var. Maksimum sayı 2100'dür.), Sorunun sp_executesql parametresi sayımı olduğunu fark ettim. Çok teşekkürler! Bu cevap için :) – marcob

+1

+1. Benimle aynı şeyleri yaşadım. VS komutunu bildirdi.Parameters.Count tam olarak 2100 ve SQL Server 2100'den fazla parametreye sahip olduğumu gösteriyordu. 3. sınıf eğitimim bana bir şeylerin ters gittiğini söyledi. Bazı deneylerle 2098'in gerçek maksimum sayıda parametre olduğunu buldum. Yani, hata iletisi en az söylemek için bir ADO.NET bakış açısından yanıltıcıdır. Microsoft'un ADO.NET uygulamasını değiştirmesi durumunda maksimumu 2090'a ayarlıyorum. –

İlgili konular