SQL Server Insert Into - Kesme hatasına neden olan sütunu belirleme


11

Bir tabloya 650 alan ekleyen bir saklı yordam var. Ek, bir kesme hatasıyla başarısız oluyor.

Bu basit

INSERT INTO
SELECT (a bunch of fields) 
FROM (a bunch of tables)

Hata mesajı aşağıdadır:

Msg 8152, Seviye 16, Durum 14, Prosedür DSP_Procedure, Line 1075 Dize veya ikili veriler kesilir.

Hangi alanın kesme hatasına neden olduğunu belirlememin hızlı bir yolu var mı?

Tabloya eklenecek select deyiminin 650 alana sahip olması, hangi alanın kesme hatasına neden olduğunu saptamayı zorlaştırır.

Ben sadece SP bir seferde 100 alan eklemek ve daha sonra en az 100 alanlı bir gruba kadar daraltıncaya kadar SP 6 veya 7 farklı kez çalıştırmak için belki bir anda alan blokları yorum olabilir düşünüyorum bu, kesme hatasına neden olan alanı içerecektir.

Alternatif olarak, belki sadece SELECT INTOyeni bir tablo ve daha sonra hangi alanın beklenenden daha uzun bir alan uzunluğu içerdiğini görmek için SP içine eklemek çalışıyorum hedef tablodaki veri uzunlukları vs tablodaki veri uzunlukları karşılaştırabilirsiniz düşünüyorum. ..

SQL Server 2014 kullanıyorum.

Daha kolay alternatifler var mı?


1
BİLGİ_SCHEMA.COLUMNS gidin ve eklemek istediğiniz veri türlerini karşılaştırmak. Ne yazık ki SQL sunucusunun ORACLE gibi değişken bildirim için dinamik veri tipleri yoktur.
MguerraTorres

2
İkinci seçeneğinizi kullanır, yeni (veya #temp) bir tabloya ekler ve sütun uzunluklarını karşılaştırırdım. Ya da LEN () öğesini seçimdeki tüm sütunların etrafına sarabilir ve ardından her biri için bir MAX () yapmak için bir sorguya sahip olabilirsiniz, bu size alanlar için en büyük metin uzunluğunu verir. Tabii ki, bu size sorun veren bir char alanı olduğunu varsayar. Smalldatetime veya tinyint kullanmıyor musunuz?
Jonathan Fite

1
"İçine Seç" yaklaşımı ile gidip sütun uzunluklarını karşılaştırırdım, evet. Belki "WHERE 1 = 0" ile tablonun satır içermemesi gerekir. SELECT'iniz seçili sütunlar için benzersiz adlar içermiyorsa gariptir. Uzun sütun listelerini sütun başına bir komut dosyası satırı, ardından gerekirse bir sonraki satırda "AS" sütun adı ve listede yer almayı kolaylaştırmak için dört sütundan sonra boş bir satır olarak biçimlendiririm. Bu ayrıca birçok satır seçmeyi ve bunları yorumlara değiştirmek için Ctrl + K Ctrl + C yapmayı destekler, böylece Ekle işlemine bu şekilde saldırabilirsiniz, ancak dışarıda kalan sütunların null edilebilir olması gerekir.
Robert Carnegie

Yanıtlar:



9

Ne yazık ki, oldukça eski bir "özellik" ile karşılaştınız. 2008'den bu yana bir Connect bileti açıldı ve neredeyse on yıldır bu bir düzeltme gerektirecek kadar önemli değildi.

Standart geçici çözüm size düşündüm gibi bir olduğu select into...tablo meta verileri karşılaştırarak izledi. Başka bir olasılık, rahatsız edici sütunu ikili olarak aramaktır, ancak bu da manuel iştir. Meta veri karşılaştırması için bazı hack'ler var, ancak basit, zarif bir çözüm mevcut değil. Belki bazı üçüncü taraf araçları yardımcı olabilir, ama bunun farkında değilim.


1

Sorgumun sonuna koyarken (QUERYTRACEON 460) kullanmak benim için çalışmadı.

DB düzeyinde açtım ve çalıştı:

DBCC TRACEON(460, -1);
GO

Ancak, sorunu bulup çözdüğünüzde tekrar kapattığınızdan emin olun, açık bırakmayın!

DBCC TRACEOFF(460, -1);
GO
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.