Questa sera sul ng microsoft.public.it.sql due utenti hanno chiesto come è possibile in SQL Server 2000 valorizzare una colonna di una tabella con un documento XML.
La domanda non è banale dato che il supporto XML in SQL Server 2000 rende agevole la trasformazione dei dati relazionali di un database in un documento XML e vice versa, ma non prevede in alcun modo un sistema nativo per memorizzare un documento XML in una tabella.
I due utenti si sono scontrati con i limiti della clausola FOR XML descritti sui Books Online nel paragrafo:
Guidelines for Using the FOR XML Clause
http://msdn.microsoft.com/library/en-us/xmlsql/ac_openxml_0alh.asp
Mentre mi stavo scervellando per trovare una soluzione pura in T-SQL vedo che Andrea Montanari si connette al messenger, così lo invito a ragionare insieme sul problema.
Andrea rammenta di aver letto qualcosa sul libro The Guru's Guide to SQL Server Stored Procedures, XML, and HTML di Ken Henderson.
Facendo una veloce ricerca scopre che nel capitolo 15 a pagina 452 viene descritta la stored procedure sp_run_xml_proc che si basa pesantemente sulle extented stored procedure sp_OA*.
In sostanza viene istanziata la classe SQLDMO.SQLServer e richiamando il metodo ExecuteWithResultsAndMessages2 viene eseguita una stored procedure contenente la clausola FOR XML AUTO passata come parametro di input.
La soluzione mi sembra decisamente arzigogolata ed inefficiente, come ammette lo stesso Ken ".... althought the prospect of having to open a separate connection into the server to translate the document is not particularly pretty one, it is unfortunately the only way to do this without resorting to client side processing, at least for now."
Così ho ripreso in mano il solito URL che suggerisco abitualmente quando qualcuno domanda come importare i dati di un documento XML in una tabella SQL Server e ho notato che l'utility TextCopy.exe può essere utilizzata per importare un documento XML in una colonna!
Ho svolto un piccolo test e funziona egregiamente:
http://www.perfectxml.com/articles/xml/importxmlsql.asp
Purtroppo da una verifica svolta da Andrea, questa utility non risulta essere presente in SQL Server 2000 Desktop Engine (MSDE 2000).
SQL Server 2005 permetterà di memorizzare documenti XML nativamente nel database attraverso l'introduzione del data type xml.
Se siete curiosi di sapere come, registratevi e seguite gratuitamente il corso 2939: Programming Microsoft® SQL Server™ 2005