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 varchar
s 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
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;
Insert Update SQL Server üzerinde sakl...
Ne ana performans varchar ve nvarchar ...
Char, nchar, varchar, ve SQL Server nv...
Nasıl SQL Server SQL Yürüt Geliştirici...
Nasıl/NVARCHAR dize eklemek bir SQL Se...