Ho una colonna varchar in una tabella che viene utilizzata per memorizzare dati xml. Sì, so che c'è un tipo di dati xml che dovrei usare, ma penso che questo sia stato impostato prima che il tipo di dati xml fosse disponibile, quindi un varchar è ciò che devo usare per ora. :)SQL Server xml string parsing in campo varchar
I dati memorizzati sembra simile al seguente:
<xml filename="100100_456_484351864768.zip"
event_dt="10/5/2009 11:42:52 AM">
<info user="TestUser" />
</xml>
Ho bisogno di analizzare il nome del file per ottenere le cifre tra i due sottolineature che in questo caso sarebbe "456". La prima parte del nome del file "non dovrebbe" cambiare in lunghezza, ma il numero medio sarà. Ho bisogno di una soluzione che funzioni se la prima parte cambia in lunghezza (sai che cambierà perché "non dovrebbe cambiare" sembra sempre che significhi che cambierà).
Per quello che ho per ora, sto usando XQuery per estrarre il nome del file perché ho pensato che questo è probabilmente il meglio della manipolazione di stringhe diritte. Lancio la stringa su xml per farlo, ma non sono un esperto di XQuery, quindi ovviamente sto riscontrando problemi. Ho trovato una funzione per XQuery (sottostringa-prima), ma non riuscivo a farlo funzionare (non sono nemmeno sicuro che la funzione funzioni con SQL Server). Potrebbe esserci una funzione XQuery per farlo facilmente, ma se c'è ne sono inconsapevole.
Così, ottengo il nome del file dalla tabella con una query simile al seguente:
select CAST(parms as xml).query('data(/xml/@filename)') as p
from Table1
Da questo mi piacerebbe pensare che sarei stato in grado di lanciare questo ritorno a una stringa poi fare un po ' funzione di instring o charindex per capire dove sono i caratteri di sottolineatura in modo da poter incapsulare tutto ciò in una funzione di sottostringa per selezionare la parte di cui ho bisogno. Senza andare troppo oltre, sono abbastanza sicuro che alla fine riuscirò a farlo in questo modo, ma so che ci deve essere un modo più semplice. In questo modo si renderebbe un campo enorme illeggibile nell'istruzione SQL che, anche se lo trasferissi in una funzione, sarebbe comunque fonte di confusione per cercare di capire cosa sta succedendo.
Sono sicuro che esiste un modo più semplice poiché sembra essere una semplice manipolazione delle stringhe. Forse qualcuno può indicarmi la giusta direzione. Grazie
Quale versione di SQL Server? –
Siamo spiacenti, non ho visto questo commento fino ad ora. Stiamo utilizzando SQL Server 2008 ora. – Dusty