Tabloda, xml verilerini depolamak için kullanılan bir varchar sütunu var. Evet, kullanmam gereken bir xml veri türü olduğunu biliyorum, ancak bunun, xml veri türü kullanıma sunulmadan önce kurulduğunu düşünüyorum, bu yüzden şu anda kullanmak zorunda olduğum bir varchar. :) saklananSQL Server xml dizgisi varchar alanında ayrıştırma
verileri aşağıdaki benzer:
<xml filename="100100_456_484351864768.zip"
event_dt="10/5/2009 11:42:52 AM">
<info user="TestUser" />
</xml>
Ben bu durumda "456" olacağını iki alt çizgi arasındaki rakamları elde etmek dosya adını ayrıştırmak gerekir. Dosya adının ilk kısmı "olmamalıdır" uzunluğunu değiştirmelidir, ancak orta sayı olacaktır. İlk bölümün uzunluğu değiştiğinde işe yarayacak bir çözüme ihtiyacım var (değişeceğini biliyorsunuz çünkü "değişmemeli" her zaman değişeceği anlamına geliyor).
Şimdilik elimde olan için, dosya adını çıkarmak için XQuery kullanıyorum çünkü bunun muhtemelen düz dize manipülasyondan daha iyi olduğunu düşündüm. Bunu yapmak için dizeyi xml'ye döküyorum, ama XQuery uzmanı değilim, tabii ki sorunlara bakıyorum. XQuery (substring-before) için bir işlev buldum, ancak çalışmaya başlayamadım (bu işlevin SQL Server ile çalışacağından bile emin değilim). Bunu kolayca yapabilmek için bir XQuery işlevi olabilir, ancak eğer bunun farkında olmasaydım. Ben sonra bazı yapmak bir dizeye bu geri CAST mümkün olacağını varsaymak istiyorum Bundan
select CAST(parms as xml).query('data(/xml/@filename)') as p
from Table1
:
Yani, aşağıdakine benzer bir sorgu ile tablodan dosya adı almak Alt simgelerin nerede olduğunu anlamak için instring veya charindex işlevi, ihtiyacım olan parçayı seçmek için tüm bunları bir altdizgeme fonksiyonunda kapsülleyebilir. Bu konuya çok fazla girmeden, sonunda böyle bir şey yapabildiğime eminim, ama daha kolay bir yolun olması gerektiğini biliyorum. Bu şekilde, SQL deyiminde büyük bir okunamaz alan oluşturabilirdi; bu, bir işleve taşınsa bile, neler olup bittiğini anlamaya çalışmak için kafa karıştırıcı olurdu.
Basit bir dize manipülasyonu olduğu için bundan daha kolay olduğundan eminim. Belki birisi bana doğru yönde işaret edebilir. Teşekkürler
SQL Server'ın hangi sürümü? –
Üzgünüz, şu ana kadar bu yorumu görmedim. Şimdi SQL Server 2008 kullanıyoruz. – Dusty