Extraire plusieurs strings de date à partir d'une seule colonne varchar (MAX) SQL Server

J'ai hérité d'un sous-système de spécification de rapport qui doit être modifié. La mission est d'append une colonne de date à la table tReports, et de la remplir avec le CreateDate qui est (supposé être) contenu dans le XML Code Spec. Le problème est que certains des anciens rapports n'ont pas l'atsortingbut CREATEDATE, ou comme dans un exemple ci-dessous, le XML est valide mais mal formé, et CREATEDATE ne peut pas être récupéré en utilisant le xQuery qui fonctionne pour la plupart des autres rapports. Comme je n'ai pas de date de création explicite dans la spécification, j'utilise l'interpolation pour estimer une date raisonnable. Un facteur de l'interpolation est de regarder les strings de date contenues dans la spécification du rapport – certaines seront utiles, d'autres pas.

Il y a trop de rapports (plus de 1 200) pour parcourir visuellement chaque spécification de rapport pour les strings de date. Ces strings de date peuvent apparaître à n'importe quel location dans la spécification de rapport, et il existe un très grand nombre de combinaisons d'éléments et d'attributes pouvant contenir une string de date.

La solution idéale serait une list des reportID et la string de date prête à utiliser dans un UPDATE, mais parce que le format de date varie (m / j / aa, mm / jj / aa, m / jj / aa …) I ' Je serais reconnaissant d'avoir un certain nombre de caractères parasites entourant la string de date que je pourrais nettoyer plus tard.

Toutes les strings de date seront à partir de 2000 ou plus tard, donc la string de search que j'ai utilisée est '/ 20', ce qui a donné de bons résultats.

J'ai regardé de nombreux sites qui discutent de ce type de problème, et j'ai trouvé une seule solution de Mikael Eriksson qui est quelque chose comme ce que je décris, mais je ne peux pas le faire fonctionner après plusieurs heures de jeu. Comment extraire plusieurs strings à partir de lignes uniques dans SQL Server

Existe-t-il un moyen, sans utiliser de slider ni de boucle WHILE, d'extraire ces dates embeddedes?

-- Some representative data: (I'm using SQL Server 2008 R2) CREATE TABLE #ReportSpecs (ReportID INT, ReportSpec VARCHAR(MAX)) INSERT INTO #ReportSpecs ( ReportID, ReportSpec ) VALUES (136, '<ReportID>136</ReportID> <EmpIDCreator>23816</EmpIDCreator> <EmpName>Blanc, Melvin J</EmpName> <ReportType>0</ReportType> <ReportName>PSST Sys Spec</ReportName> <ReportData> <REPORT> <COLUMNS> <Column Name="JobNumber" Position="1" /> <Column Name="TaskType" Position="2" /> <Column Name="Assignees" Position="3" /> <Column NAME="JobDueDate" Position="4" /> <Column Name="ReferenceNumber" Position="5" /> <Column Name="Deliverable" Position="6" /> <Column Name="Priority" Position="7" /> </COLUMNS> <FILTERS> <FILTER NAME="TYPE" VALUE="To_Me" /> <FILTER NAME="Status" VALUE="All" /> <FILTER NAME="DateOptions" VALUE="DateRange" From="8/16/2002" To="8/23/2002" /> <FILTER NAME="FromDate" VALUE="8/16/2002" /> <FILTER NAME="ToDate" VALUE="8/23/2002" /> <FILTER NAME="Role" VALUE="All" /> </FILTERS> <parameters> <PARAMETER NAME="@Cascading" TYPE="integer" VALUE="0" /> <PARAMETER NAME="@EmpID" SYSTEM="true" TYPE="integer" VALUE="#Request.EmployeeIDAlias#" /> <PARAMETER NAME="@FromOrgs" TYPE="varchar(250)" VALUE="" /> <PARAMETER NAME="@ToOrgs" TYPE="varchar(250)" VALUE="" /> </parameters> <NAME>PSST Sys Spec</NAME> <OWNER> <ID>23816</ID> </OWNER> <source id="8" useinternalid="True" /> </REPORT> </ReportData>'), (311, '<ReportID>311</ReportID> <EmpIDCreator>7162</EmpIDCreator> <EmpName>Potter, Harry J</EmpName> <ReportType>0</ReportType> <ReportName>CPVC Synch Test</ReportName> <ReportData> <REPORT> <COLUMNS> <Column Name="JobNumber" Position="1" /> <Column Name="TaskType" Position="2" /> <Column Name="Subject" Position="3" /> <Column Name="CurrentAssignee" Position="4" /> <Column NAME="JobDueDate" Position="5" /> <Column Name="Deliverable" Position="6" /> <Column Name="Category" Position="7" /> <Column Name="Priority" Position="8" /> </COLUMNS> <FILTERS> <FILTER NAME="TYPE" VALUE="By_Orgs_6098,By_Orgs_6123" /> <FILTER NAME="Status" VALUE="Open" /> <FILTER NAME="DateOptions" VALUE="DateRange" From="3/25/2002" To="4/4/2002" /> <FILTER NAME="ReviewFromDate" VALUE="3/25/2002" /> <FILTER NAME="ReviewToDate" VALUE="4/4/2002" /> <FILTER NAME="Role" VALUE="All" /> </FILTERS> <parameters> <PARAMETER NAME="@Act" TYPE="integer" VALUE="0" /> <PARAMETER NAME="@MgrID" SYSTEM="true" TYPE="integer" VALUE="#Request.EmployeeIDAlias#" /> <PARAMETER NAME="@MgrIDActing" TYPE="integer" VALUE="" /> <PARAMETER NAME="@FromDept" TYPE="varchar(250)" VALUE="" /> <PARAMETER NAME="@FromEmp" TYPE="varchar(250)" VALUE="" /> <PARAMETER NAME="@ToDept" TYPE="varchar(250)" VALUE="" /> </parameters> <NAME>CPVC Synch Test</NAME> <OWNER> <ID>7162</ID> </OWNER> <source id="17" useinternalid="True" /> </REPORT> </ReportData>'), (1131, '<ReportID>1131</ReportID> <EmpIDCreator>13185</EmpIDCreator> <EmpName>Reed, Alan</EmpName> <ReportType>0</ReportType> <ReportName> ''"><script>alert(''hello'')</script> </ReportName> <ReportData> <Report NAME="''"> <script>alert(''hello'')</script>" CREATEDATE="12/7/2009"> <DESCRIPTION>sfasf</DESCRIPTION> <OWNER ID="13185"/> <SOURCE ID="1" USEINTERNALID="TRUE"/> <COLUMNS> <COLUMN NAME="JobNumber" POSITION="1" SORTORDER="asc"/> </COLUMNS> <FILTERS> <FILTER NAME="TYPE" VALUE="By_Me,To_Me" /> <FILTER NAME="ASGSTATUS" VALUE="Open" /> <FILTER NAME="DATEOPTIONS" VALUE="All" /> <FILTER NAME="STATUS" VALUE="Open" /> <FILTER NAME="ASGDATEOPTIONS" VALUE="All" /> <FILTER NAME="ROLE" VALUE="All" /> </FILTERS> <PARAMETERS> <PARAMETER NAME="@Me" TYPE="integer" VALUE="3" /> <PARAMETER NAME="@FromCost" TYPE="varchar(250)" VALUE=""/> <PARAMETER NAME="@ToCost" TYPE="varchar(250)" VALUE="" /> </PARAMETERS> <ADVANCEDSORT SortByA="JobNumber" SortOrderA="asc" SortByB="" SortOrderB="" SortByC="" SortOrderC="" /> </Report> </ReportData>'); /* Desired Output (A DISTINCT list would be better, but just getting this output would be GREAT.) ReportID DateSsortingng -------- ---------- 136 8/16/2002 136 8/23/2002 136 8/16/2002 136 8/23/2002 311 3/25/2002 311 4/4/2002 311 3/25/2002 311 4/4/2002 1131 12/7/2009 */ DROP TABLE #ReportSpecs 

Merci pour votre time.

 select R.ReportID, DV as DateSsortingng from #ReportSpecs as R cross apply (select cast(R.ReportSpec as xml)) as X(R) cross apply XRnodes('//@*, //*/text()') as T(X) cross apply (select TXvalue('.', 'varchar(max)')) as D(V) where charindex('/20', DV) > 0 

Résultat:

 ReportID DateSsortingng ----------- -------------------------- 136 8/16/2002 136 8/23/2002 136 8/16/2002 136 8/23/2002 311 3/25/2002 311 4/4/2002 311 3/25/2002 311 4/4/2002 1131 " CREATEDATE="12/7/2009">