SORU
28 EYLÜL 2012, Cuma


SQL NVARCHAR ve VARCHAR Sınırları

Hepsi, (kaçınılmaz) büyük dinamik bir SQL sorgusu var. Seçim kriterlerini alan sayısı nedeniyle dize dinamik SQL içeren 4000 karakter üzerinde büyüyor. Şimdi, 4000 max NVARCHAR(MAX), ama ifade için Server Profiler idam SQL bakıyor olduğunu anlıyorum

DELARE @SQL NVARCHAR(MAX);
SET @SQL = 'SomeMassiveString > 4000 chars...';
EXEC(@SQL);
GO

İş gibi görünüyor(!?), ayrıca büyük bir sorgu için bu 4000 sınırı ile ascociated bir hata atar(!?), temelde bu 4000 sınırı sonra SQL kırpar ve bir sözdizimi hatası ile beni bırakır. Bu dinamik SQL sorgu gösteriyor profiler bu olmasına rağmen. biraz araştırma yapmaktam(!?).

Burada tam olarak ne oluyor ve sadece bu @SQL VARCHAR değişken dönüştürme olmalıyım ve devam etmek mi?

Zaman ayırdığınız için teşekkürler.

Ps. Ayrıca 4000'den fazla karakter yazdırmak için bu büyük sorgular bakmak için iyi olurdu. Aşağıdaki 4000 sınırlıdır

SELECT CONVERT(XML, @SQL);
PRINT(@SQL);

başka bir yol serin var mı?

CEVAP
28 EYLÜL 2012, Cuma


NVARCHAR(MAX) 4000 max bir dizi olduğunu anlıyorum

Anlayışınız yanlış. nvarchar(max) (ve ötesinde bazen) depolayabilir data 2 GB (1 milyar çift bayt karakter).

Çevrimiçi nchar and nvarchar dilbilgisi

nvarchar [ ( n | max ) ]

| karakteri bu alternatifler olduğu anlamına gelir. yani belirtinyan değişmez max.

Eğer tercih belirlemek için özel n sonra da bu olmalı 1 ila 4,000 ama kullanma max tanımlar o kadar büyük bir nesne türü (değiştirme ntext hangisi kaldırılmış).

SQL aslında 2008 Server için gibi görünüyordeğişken2 GB sınırını süresiztempdb yeterli alan(Shown here) tabi aştı

Sorunuzun diğer kısımları ile ilgili

Bitiştirmek kesme türü bağlıdır.

  1. varchar(n) varchar(n) 8,000 karakter keser.
  2. nvarchar(n) nvarchar(n) 4,000 karakter keser.
  3. varchar(n) nvarchar(n) 4,000 karakter keser. nvarchar sonuç nvarchar(4,000) çok daha yüksek önceliğe sahiptir
  4. [n]varchar(max) [n]varchar(max) kesilme olmaz < 2 GB için).
  5. 24* nvarchar(n) *kesilme olmaz < 2 GB için) ve sonuç nvarchar(max) olarak yazılmış olacak.
  6. * varchar(n) *27 ilk nvarchar(n) 29 *giriş dönüştürmek ve birleştirme yapın.Eğer varchar(n) dize uzunluğunu 4000 karakterden daha büyükse cast 32* *olacak ve kesilme oluşur.

String veri hazır

N öneki kullanın ve dize <= 4,000 n ** * * * 34 * olarak yazılmış olacak karakter uzun bir dize uzunluğu. N'Foo' nvarchar(3) olarak kabul edilir. Eğer dize 4000 karakterden daha uzunsa nvarchar(max) olarak kabul edilecektir

N öneki kullanmayın ve dize <= 8.000 karakter n dize uzunluğunu nerede varchar(n) olarak yazılmış olacak uzun. varchar(max) daha uzun

Eğer dize uzunluğu sıfır ise yukarıdaki de o zaman n 1 olarak ayarlanır.

Yeni sözdizimi öğeleri.

1.CONCAT işlevi burada hiçbir faydası yok

DECLARE @A5000 VARCHAR(5000) = REPLICATE('A',5000);

SELECT DATALENGTH(@A5000   @A5000), 
       DATALENGTH(CONCAT(@A5000,@A5000));

Yukarıdaki birleştirme her iki yöntem için 8000 verir.

2. = ile dikkatli olun

DECLARE @A VARCHAR(MAX) = '';

SET @A = REPLICATE('A',5000)   REPLICATE('A',5000)

DECLARE @B VARCHAR(MAX) = '';

SET @B = @B   REPLICATE('A',5000)   REPLICATE('A',5000)


SELECT DATALENGTH(@A), 
       DATALENGTH(@B);`

Verir

-------------------- --------------------
8000                 10000

@A kesme karşılaştı unutmayın.

Nasıl yaşadığınız sorunu çözmek için.

Ya max iki olmayan veri türleri nvarchar yazılan bir dize (bile nvarchar(max)) varchar(4001 - 8000) bir dizeyi bitiştirmek çünkü birlikte veya bitiştirmek çünkü birleştirme alıyorsanız.

İkinci sorun, sadece önlemek için tüm dize hazır bilgi (ya da en azından bu 4001 - 8000 aralığında uzunlukları ile) N ile başında olduğundan emin olun.

İlk sorunu önlemek için değişikliği atama

DECLARE @SQL NVARCHAR(MAX);
SET @SQL = 'Foo'   'Bar'   ...;

İçin

DECLARE @SQL NVARCHAR(MAX) = ''; 
SET @SQL = @SQL   'Foo'   'Bar'

NVARCHAR(MAX) baştan birleştirme (her birleştirme sonucu da NVARCHAR(MAX) olacak gibi, bu yaymak) yer almaktadır

Görüntülerken kaçınarak kesme

Sen "modunu kullanabilirsiniz . seçilen" kılavuz sonuçlar var tabii

select @SQL as [processing-instruction(x)] FOR XML PATH 

SSMS seçenekleri XML sonuçlar için sınırsız uzunluğu ayarlamak için izin ver. processing-instruction bit < gibi karakterler < otomatik olarak seçer sorunları önler.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • alexis gillis

    alexis gilli

    23 HAZİRAN 2011
  • Anthony Cumia

    Anthony Cumi

    5 EYLÜL 2006
  • jedimasterkyle

    jedimasterky

    11 ŞUBAT 2006