2011-01-30 13 views
7

Son zamanlarda bir uygulamayı SQL Server'a taşıyarak bir sorunla karşılaştım. Bu sorunun bir saklı yordam parametre kendisine geçirilen veriler için çok kısa olarak ilan edilen neden olduğunu ortaya çıktı: parametresi VARCHAR(100) olarak ilan edildi ama bir durumda veri 100'den fazla karakter geçirilen. Beni şaşırtan şey, SQL Server'ın herhangi bir hata veya uyarı bildirmediği idi - bu sadece verileri sessizce 100 karaktere böldü. En az SQL Server'ın yerel değişkenlerde ve saklı yordam parametrelerinde sessizce kesilmesini engellemenin bir yolu var mı?

 
1> declare @s varchar(5) = '123456789'; 
2> print @s; 
3> go 
12345 

Ben SQL Server rapor hataları için etkinleştirebilirsiniz bir seçenek var mı (ya da:

 
1> create procedure WhereHasMyDataGone (@data varchar(5)) as 
2> begin 
3>  print 'Your data is ''' + @data + '''.'; 
4> end; 
5> go 
1> exec WhereHasMyDataGone '123456789'; 
2> go 
Your data is '12345'. 

Yerel değişkenler de aynı davranışı sergiler:

aşağıdaki SQLCMD oturumu bu gösterir uyarılar) böyle durumlarda? Veya tüm yerel değişkenleri ve saklı yordam parametrelerini VARCHAR(MAX) veya NVARCHAR(MAX) olarak mı belirtmeliyim?

+1

Yinelenen (http://stackoverflow.com/questions/4628140/sql-server-silently-truncates-varchars-in-stored-proced [SQL Server sessizce saklı prosedürler varchar en keser] materyal Şekiller). Siz ** yapamazsınız. – gbn

+0

@gbn: Yinelenen yeri bulduğunuz için teşekkürler - kendimi tespit etmediğim için özür dilerim. –

cevap

2

SQL Server böyle seçeneği vardır. Saklı yordamınızdaki dizelerin uzunluğunu elle kontrol etmeniz ve bir şekilde daha uzun dizeleri işlemeniz veya nvarchar (max) seçeneğini kullanmanız gerekir. Disk alanı bir sorun değilse, nvarchar (max) seçeneği kesinlikle en kolay ve hızlı çözümdür.

+0

Bunun böyle olduğundan şüphelendim ama yine de sormam gerektiğini düşündüm. Şüphemi doğruladığın için teşekkürler. –

1

ben sunucu bunu yapmak için bir yol bilmiyorum, ama ben Visual Studio Team System Geliştirici Edition SQL Server Projeleri özelliğini kullanıyorum. Benim bir kesim problemi yakalayan kod analizi içerir: smallint sütununa eklemek için bir int parametresi kullanarak.

0

Sen SQL SOL kullanmak ve eklemek istediğiniz uzunluğu belirtilen edebilirsiniz. Örneğin, .

CREATE TABLO Tablo 1. ( Test varchar (10) ) Tablo 1. değerlerine

uç (SOL ('abcdefghijklmnopqrstuvwxyz', 10))

Bu tablo, sadece

ABCDEFGHIJ ekler arasında

+0

Sorun, * SQL'in gizli ve sessizce kesilmiş dizeleri Saklı Yordamlara geçirilmesinin nasıl önleneceğini soruyor. Bu cevap, dizeleri açıkça kesmeyi nasıl söyler. * * SQL sunucu davranışı farklıysa ve soru "çok uzun bir dizeyi geçtiğimde bir hatayı nasıl önleyebilirim" ise bu geçerli bir yanıt olabilir. – Timbo

İlgili konular