SORU
7 Ocak 2011, Cuma


Sessizce'nın saklı yordamları, SQL Server keser varchar

Göre this forum discussion SQL Server (2005 kullanıyorum ama anladığım kadarıyla bu da geçerli 2000-2008) sessizce keser her varchars belirttiğiniz gibi saklı yordam parametreleri için uzunluğu sütun bile takmadan dize doğrudan kullanarak bir INSERT aslında neden bir hata. örn. Eğer bu tablo oluşturun:

CREATE TABLE testTable(
    [testStringField] [nvarchar](5) NOT NULL
)

aşağıdaki öldürdüğümde sonra:

INSERT INTO testTable(testStringField) VALUES(N'string which is too long')

Ben bir hata alıyorum:

String or binary data would be truncated.
The statement has been terminated.

Harika. Veri bütünlüğü korunmuş, ve arayan kişi de bunu biliyor. Şimdi eklemek için saklı bir prosedür tanımlayalım:

CREATE PROCEDURE spTestTableInsert
    @testStringField [nvarchar](5)
AS
    INSERT INTO testTable(testStringField) VALUES(@testStringField)
GO

ve çalıştırmak:

EXEC spTestTableInsert @testStringField = N'string which is too long'

, 1 hata satır etkiledi. Bir satır testStringField ile tabloya eklenen,''. strın olarak Sessizce kesildi saklı yordam varchar parametre SQL Server.

Şimdi, bu davranış zaman kullanışlı olabilir ama bunu kapatmanın YOLU YOK sanırım. Bu son derece sinir bozucuistiyorumsaklı yordam için çok uzun bir dize geçersem hata bir şey. Bu ile başa çıkmak için 2 yol var gibi görünüyor.

İlk olarak, saklı yordam @testStringField büyüklüğü 6 ve uzunluğu 5 üzerinden olup olmadığını kontrol parametresi olarak bildirin. Bu biraz kesmek gibi görünüyor ve demirbaş kodu miktarda tahriş edici içerir.

İkincisi, TÜM saklı yordam parametreleri varchar(max), varchar ve saklı yordam içinde INSERT deyimi başarısız ilan edelim o zaman.

İkincisi sanırım iyi çalışıyor, yani benim soru: iyi fikir kullanın varchar(max) Her ZAMAN dizeleri için SQL Server depolanmış yordamları, Eğer gerçekten istediğim bu saklı yordam başarısız olduğunda çok uzun bir dize geçti? Hatta en iyi yöntem olabilir mi? Devre dışı bırakılabilir mi bu sessiz kesilmesi bana saçma geldi.

CEVAP
7 Ocak 2011, Cuma


Sadece.

Asla benim çeklerden birisi benim parametreleri Tablo sütun benim uzunlukları maç sağlamak için, çünkü bir sorun olsa fark ettim. İstemci kodunda da. Şahsen, asla çok uzun verileri görmek için SQL beklerdim. Eğer kesilen veriler gördüğümde ise, buna neyin sebep kanama belli olur.

Eğer hissederseniz varchar(max) datatype precedence çünkü büyük bir performans sorunu sakının. ikilik(max) ikilik(n) (en yüksek) daha yüksek önceliğe sahiptir. Bu tür sorgu, bu yüzden bir arama ve(100) her varchar değeri INSERT deyim DÖKME değil tarama(max) alırsınız

UPDATE ...WHERE varchar100column = @varcharmaxvalue

Düzenleme:

open Microsoft Connect item bu konu ile ilgili.

Ve muhtemelen Erland Sommarkog's Strict settings eklenmesi (matching Connect item) değer.

2, Martins sonra yorum: düzen

DECLARE @sql VARCHAR(MAX), @nsql nVARCHAR(MAX);
SELECT @sql = 'B', @nsql = 'B'; 
SELECT 
   LEN(@sql), 
   LEN(@nsql), 
   DATALENGTH(@sql), 
   DATALENGTH(@nsql)
;

DECLARE @t table(c varchar(8000));
INSERT INTO @t values (replicate('A', 7500));

SELECT LEN(c) from @t;
SELECT 
   LEN(@sql   c), 
   LEN(@nsql   c), 
   DATALENGTH(@sql   c), 
   DATALENGTH(@nsql   c) 
FROM @t;

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Renaud

    Charles Rena

    10 Kasım 2007
  • TheForgottenGamer1

    TheForgotten

    28 AĞUSTOS 2009
  • tsweeney79

    tsweeney79

    21 Ocak 2008