smithicus



Hi there,

I have an irritating problem which I just cant seem to solve. I am trying to retrieve the relational dataset from an xml column using the nodes method provided by SQL Server 2005. This shredding to relational data is done by one stored procedure which is triggered when the xml document is retrieved by a soap service. The stored procedure first inserts the xmldocument into an xml column after which its start shredding the data to relational data.

The error I receive is:
Msg 8623, Level 16, State 1, Line 139

The query processor ran out of internal resources and could not produce a query plan. This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.


Below is a short code snippet of the stored procedure. This snippit only represents one sction. In total the stored procedure contains three more sections like the one displayed here.

PRINT 'STAP2A: Update Home Data'

UPDATE tb_Import_WoningGegevensRelationeel

SET

cv_aanwezig = q.cv_aanwezig,

stadsverwarming = q.stadsverwarming,

cv_combi = q.cv_combi,

warmtemeter = q.warmtemeter,

oppberging = q.oppberging,

verhuurdatum = q.verhuurdatum,

garage_carport = q.garage_carport,

bouwjaar = q.bouwjaar,

lift_aanwezig = q.lift_aanwezig,

codebuitenruimte = q.codebuitenruimte,

marktkenmerk = q.marktkenmerk,

gebruik = q.gebruik

FROM

(

SELECT

VHE.C.value('(./vhe)[1]','nvarchar(max)') As VheNummerUitgebreid,

cv_aanwezig.C.value('(.)[1]','nvarchar(max)') cv_aanwezig,

stadsverwarming.C.value('(.)[1]','nvarchar(max)') stadsverwarming,

cv_combi.C.value('(.)[1]','nvarchar(max)') cv_combi,

warmtemeter.C.value('(.)[1]','nvarchar(max)') warmtemeter,

oppberging.C.value('(.)[1]','nvarchar(max)') oppberging,

verhuurdatum.C.value('(.)[1]','nvarchar(max)') verhuurdatum,

garage_carport.C.value('(.)[1]','nvarchar(max)') garage_carport,

bouwjaar.C.value('(.)[1]','nvarchar(max)') bouwjaar,

lift_aanwezig.C.value('(.)[1]','nvarchar(max)') lift_aanwezig,

codebuitenruimte.C.value('(.)[1]','nvarchar(max)') codebuitenruimte,

marktkenmerk.C.value('(.)[1]','nvarchar(max)') marktkenmerk,

gebruik.C.value('(.)[1]','nvarchar(max)') gebruik

FROM @vheupdate.nodes('//row') VHE(C)

OUTER APPLY VHE.C.nodes('./cv_aanwezig') cv_aanwezig(C)

OUTER APPLY VHE.C.nodes('./stadsverwarming') stadsverwarming(C)

OUTER APPLY VHE.C.nodes('./cv_combi') cv_combi(C)

OUTER APPLY VHE.C.nodes('./warmtemeter') warmtemeter(C)

OUTER APPLY VHE.C.nodes('./oppberging') oppberging(C)

OUTER APPLY VHE.C.nodes('./verhuurdatum') verhuurdatum(C)

OUTER APPLY VHE.C.nodes('./garage_carport') garage_carport(C)

OUTER APPLY VHE.C.nodes('./bouwjaar') bouwjaar(C)

OUTER APPLY VHE.C.nodes('./lift_aanwezig') lift_aanwezig(C)

OUTER APPLY VHE.C.nodes('./codebuitenruimte') codebuitenruimte(C)

OUTER APPLY VHE.C.nodes('./marktkenmerk') marktkenmerk(C)

OUTER APPLY VHE.C.nodes('./gebruik') gebruik(C)

)q

WHERE vhe = q.VheNummerUitgebreid AND WoningXML_id = @WoningXML_id


When I execute each section individually there is no problem. But when all four sections are run sequentially, by executing the stored procedure, SQL Server 2005 just says no Smile




Re: Shredding XML to Relational Data: Query Processor Out of Resources

smithicus



Perhaps the complete case of my situation would be handy. Te stored procedure above uses two main tables:
- tb_Import_WoningGegevensRelationeel
- tb_Import_WoningGegevensXML

USE [SOAP_Repos]
GO
/****** Object: Table [dbo].[tb_Import_WoningGegevensRelationeel] Script Date: 03/28/2007 12:14:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tb_Import_WoningGegevensRelationeel](
[VheUpdateID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[WoningXML_id] [int] NOT NULL,
[verwerkt] [smallint] NULL CONSTRAINT [DF_tb_Import_VheUpdate_XML_Verwerkt] DEFAULT ((0)),
[vhe] [varchar](50) NULL,
[corporatieNummerNCCW] [varchar](50) NULL,
[corporatieNummer] [varchar](50) NULL,
[complexnummer] [varchar](50) NULL,
[straatnaam] [varchar](50) NULL,
[huisnummer] [varchar](50) NULL,
[toevoeging] [varchar](50) NULL,
[postcodeCijfers] [varchar](50) NULL,
[postcodeLetters] [varchar](50) NULL,
[plaats] [varchar](50) NULL,
[aantalKamers] [varchar](50) NULL,
[oppwoonkamer1] [varchar](50) NULL,
[oppwoonkamer2] [varchar](50) NULL,
[subshuur] [varchar](50) NULL,
[streefhuur] [varchar](50) NULL,
[oppvertrektotaal] [varchar](50) NULL,
[cv_aanwezig] [varchar](50) NULL,
[stadsverwarming] [varchar](50) NULL,
[cv_combi] [varchar](50) NULL,
[warmtemeter] [varchar](50) NULL,
[oppberging] [varchar](50) NULL,
[wozwaarde] [varchar](50) NULL,
[verhuurdatum] [varchar](50) NULL,
[nettohuur] [varchar](50) NULL,
[servicekosten] [varchar](50) NULL,
[stookkosten] [varchar](50) NULL,
[oppslaapkamer1] [varchar](50) NULL,
[oppslaapkamer2] [varchar](50) NULL,
[oppslaapkamer3] [varchar](50) NULL,
[oppslaapkamer4] [varchar](50) NULL,
[garage_carport] [varchar](50) NULL,
[bouwjaar] [varchar](50) NULL,
[lift_aanwezig] [varchar](50) NULL,
[codebuitenruimte] [varchar](50) NULL,
[oppovvertrek1] [varchar](50) NULL,
[oppovvertrek2] [varchar](50) NULL,
[oppzolder] [varchar](50) NULL,
[marktkenmerk] [varchar](50) NULL,
[gebruik] [varchar](50) NULL,
[tijdRegistratie] AS (getdate()),
CONSTRAINT [PK_tb_Import_VheUpdate_XML] PRIMARY KEY CLUSTERED
(
[VheUpdateID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[tb_Import_WoningGegevensRelationeel] WITH CHECK ADD CONSTRAINT [FK_tb_Import_WoningGegevensRelationeel_tb_Import_WoningGegevensXML] FOREIGN KEY([WoningXML_id])
REFERENCES [dbo].[tb_Import_WoningGegevensXML] ([id])
GO
ALTER TABLE [dbo].[tb_Import_WoningGegevensRelationeel] CHECK CONSTRAINT [FK_tb_Import_WoningGegevensRelationeel_tb_Import_WoningGegevensXML]

USE [SOAP_Repos]
GO
/****** Object: Table [dbo].[tb_Import_WoningGegevensXML] Script Date: 03/28/2007 12:14:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tb_Import_WoningGegevensXML](
[id] [int] IDENTITY(1,1) NOT NULL,
[woningGegevensXML] [xml] NOT NULL,
CONSTRAINT [PK_tb_Import_WoningGegevensXML] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


The XML file used:
<vheupdate>
<WSDLWoning>
<woning>
<row num="1">
<vhe>92002200500</vhe>
<identificatiecode>920</identificatiecode>
<complexnummer>22</complexnummer>
<straatnaam>KAKESTREET</straatnaam>
<huisnummer>99</huisnummer>
<postcodeCijfers>9999</postcodeCijfers>
<postcodeLetters>AA</postcodeLetters>
<plaats>FAKE</plaats>
<aantalKamers>3</aantalKamers>
<oppwoonkamer1>30.40</oppwoonkamer1>
<subshuur>510.00</subshuur>
<streefhuur>426.99</streefhuur>
<oppvertrektotaal>63.31</oppvertrektotaal>
<cv_aanwezig>J</cv_aanwezig>
<cv_combi>J</cv_combi>
<oppberging>4.10</oppberging>
<wozwaarde>159800</wozwaarde>
<verhuurdatum>20070322</verhuurdatum>
<nettohuur>488.27</nettohuur>
<servicekosten>32.25</servicekosten>
<oppslaapkamer1>13.29</oppslaapkamer1>
<oppslaapkamer2>7.70</oppslaapkamer2>
<bouwjaar>1993</bouwjaar>
<lift_aanwezig>13</lift_aanwezig>
<codebuitenruimte>1</codebuitenruimte>
<marktkenmerk>46233244</marktkenmerk>
<gebruik>8</gebruik>
</row>
</woning>
</WSDLWoning>
<WSDLWoning>
</vheupdate>






Re: Shredding XML to Relational Data: Query Processor Out of Resources

smithicus

I have found the solution. It was given to me by Andre on www.sqlpass.nl.

the weird omega columns should be replaced with [1]

Declare @xml xml
Set @xml = XML doc here!!!

Select
tab
.col.value('@num ]', 'int') RowNumber,
tab.col.value('vhe ]', 'varchar(50)') VHE,
tab.col.value('cv_aanwezig ]', 'varchar(50)') cv_aanwezig,
tab.col.value('bouwjaar ]', 'varchar(50)') bouwjaar
From @xml.nodes('vheupdate/WSDLWoning/woning/row') as tab(col)