Один из ваших вопросов является что OPENXML не обрабатывает «пространство имен по умолчанию» очень хорошо. (кроме того, что никто больше не рекомендует его использование).
Вот как принудительно использовать пространство имен по умолчанию с помощью openxml.
(от http://beyondrelational.com/modules/2/blogs/28/posts/10501/xquery-lab-59-openxml-and-xml-namespace-declarations.aspx)
declare @xmlDoc nvarchar(4000)
SET @xmlDoc='
<q:quakeml xmlns="http://quakeml.org/xmlns/bed/1.2" xmlns:catalog="http://anss.org/xmlns/catalog/0.1" xmlns:q="http://quakeml.org/xmlns/quakeml/1.2">
<eventParameters publicID="quakeml:earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.quakeml">
<event catalog:datasource="nc" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/earthquakes/feed/v1.0/detail/nc72431490.quakeml"><description><type>earthquake name</type><text>7km W of Cobb, California</text></description><origin catalog:datasource="nc" catalog:dataid="nc72431490" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml"><time><value>2015-04-20T13:08:32.490Z</value></time><longitude><value>-122.810997</value></longitude><latitude><value>38.8321648</value></latitude><depth><value>2340</value><uncertainty>940</uncertainty></depth><originUncertainty><horizontalUncertainty>380</horizontalUncertainty><preferredDescription>horizontal uncertainty</preferredDescription></originUncertainty><quality><usedPhaseCount>9</usedPhaseCount><usedStationCount>9</usedStationCount><standardError>0.02</standardError><azimuthalGap>114</azimuthalGap><minimumDistance>0.008787</minimumDistance></quality><evaluationMode>automatic</evaluationMode><creationInfo><agencyID>NC</agencyID><creationTime>2015-04-20T13:10:09.370Z</creationTime><version>0</version></creationInfo></origin><magnitude catalog:datasource="nc" catalog:dataid="nc72431490" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml#magnitude"><mag><value>0.29</value></mag><type>md</type><stationCount>1</stationCount><originID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml</originID><evaluationMode>automatic</evaluationMode><creationInfo><agencyID>NC</agencyID><creationTime>2015-04-20T13:10:09.370Z</creationTime></creationInfo></magnitude><preferredOriginID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml</preferredOriginID><preferredMagnitudeID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml#magnitude</preferredMagnitudeID><type>earthquake</type><creationInfo><agencyID>nc</agencyID><creationTime>2015-04-20T13:17:04.229Z</creationTime><version>0</version></creationInfo></event>
<creationInfo><creationTime>2015-04-20T13:31:33.000Z</creationTime></creationInfo>
</eventParameters></q:quakeml>
'
declare @i int
exec sp_xml_preparedocument @i output, @xmlDoc,'<root xmlns:HaveToUsePlaceholderForDefaultAlias="http://quakeml.org/xmlns/bed/1.2" xmlns:q="http://quakeml.org/xmlns/quakeml/1.2" />'
SELECT * FROM OPENXML(@i, '/q:quakeml/HaveToUsePlaceholderForDefaultAlias:eventParameters/HaveToUsePlaceholderForDefaultAlias:event',2)
WITH (
MyDescriptionType nvarchar(200) 'HaveToUsePlaceholderForDefaultAlias:description[1]/HaveToUsePlaceholderForDefaultAlias:type[1]/.'
, MyMagValue nvarchar(200) 'HaveToUsePlaceholderForDefaultAlias:magnitude[1]/HaveToUsePlaceholderForDefaultAlias:mag[1]/HaveToUsePlaceholderForDefaultAlias:value[1]/.'
, MagType nvarchar(200) 'HaveToUsePlaceholderForDefaultAlias:magnitude[1]/HaveToUsePlaceholderForDefaultAlias:type[1]/.'
)
exec sp_xml_removedocument @i
Вы должны пронизывают код с "HaveToUsePlaceholderForDefaultAlias:" повсюду.
Я бы предложил НЕ использовать OPENXML.
Вот «узловая» версия ....... с гораздо более чистым использованием пространства имен по умолчанию.
declare @xmldoc xml
select @xmldoc =
'
<q:quakeml xmlns="http://quakeml.org/xmlns/bed/1.2" xmlns:catalog="http://anss.org/xmlns/catalog/0.1" xmlns:q="http://quakeml.org/xmlns/quakeml/1.2">
<eventParameters publicID="quakeml:earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.quakeml">
<event catalog:datasource="nc" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/earthquakes/feed/v1.0/detail/nc72431490.quakeml">
<description>
<type>earthquake name</type>
<text>7km W of Cobb, California</text>
</description>
<origin catalog:datasource="nc" catalog:dataid="nc72431490" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml">
<time>
<value>2015-04-20T13:08:32.490Z</value>
</time>
<longitude>
<value>-122.810997</value>
</longitude>
<latitude>
<value>38.8321648</value>
</latitude>
<depth>
<value>2340</value>
<uncertainty>940</uncertainty>
</depth>
<originUncertainty>
<horizontalUncertainty>380</horizontalUncertainty>
<preferredDescription>horizontal uncertainty</preferredDescription>
</originUncertainty>
<quality>
<usedPhaseCount>9</usedPhaseCount>
<usedStationCount>9</usedStationCount>
<standardError>0.02</standardError>
<azimuthalGap>114</azimuthalGap>
<minimumDistance>0.008787</minimumDistance>
</quality>
<evaluationMode>automatic</evaluationMode>
<creationInfo>
<agencyID>NC</agencyID>
<creationTime>2015-04-20T13:10:09.370Z</creationTime>
<version>0</version>
</creationInfo>
</origin>
<magnitude catalog:datasource="nc" catalog:dataid="nc72431490" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml#magnitude">
<mag>
<value>0.29</value>
</mag>
<type>md</type>
<stationCount>1</stationCount>
<originID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml</originID>
<evaluationMode>automatic</evaluationMode>
<creationInfo>
<agencyID>NC</agencyID>
<creationTime>2015-04-20T13:10:09.370Z</creationTime>
</creationInfo>
</magnitude>
<preferredOriginID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml</preferredOriginID>
<preferredMagnitudeID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml#magnitude</preferredMagnitudeID>
<type>earthquake</type>
<creationInfo>
<agencyID>nc</agencyID>
<creationTime>2015-04-20T13:17:04.229Z</creationTime>
<version>0</version>
</creationInfo>
</event>
<creationInfo>
<creationTime>2015-04-20T13:31:33.000Z</creationTime>
</creationInfo>
</eventParameters>
</q:quakeml>
'
;WITH XMLNAMESPACES ('http://quakeml.org/xmlns/quakeml/1.2' AS q, DEFAULT 'http://quakeml.org/xmlns/bed/1.2')
SELECT
MyDescriptionType = Y.i.value('./description[1]/type[1]/.', 'varchar(64)')
, MyMagValue = Y.i.value('./magnitude[1]/mag[1]/value[1]/.', 'varchar(64)')
, MagType = Y.i.value('./magnitude[1]/type[1]/.', 'varchar(64)')
FROM
@xmldoc.nodes('/q:quakeml/eventParameters/event') AS Y(i)
APPEND:
Вы можете поместить данные в таблице #temp, а затем вставить данные из таблицы #temp в «реальную» таблицу.
IF OBJECT_ID('tempdb..#Holder') IS NOT NULL
begin
drop table #Holder
end
CREATE TABLE #Holder (ID int identity (1000,1) , MyDescription varchar(64) , Longitude numeric(18,6) , Magnitude varchar(64) , MagType varchar(64))
declare @xmldoc xml
select @xmldoc =
'
<q:quakeml xmlns="http://quakeml.org/xmlns/bed/1.2" xmlns:catalog="http://anss.org/xmlns/catalog/0.1" xmlns:q="http://quakeml.org/xmlns/quakeml/1.2">
<eventParameters publicID="quakeml:earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.quakeml">
<event catalog:datasource="nc" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/earthquakes/feed/v1.0/detail/nc72431490.quakeml">
<description>
<type>earthquake name</type>
<text>7km W of Cobb, California</text>
</description>
<origin catalog:datasource="nc" catalog:dataid="nc72431490" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml">
<time>
<value>2015-04-20T13:08:32.490Z</value>
</time>
<longitude>
<value>-122.810997</value>
</longitude>
<latitude>
<value>38.8321648</value>
</latitude>
<depth>
<value>2340</value>
<uncertainty>940</uncertainty>
</depth>
<originUncertainty>
<horizontalUncertainty>380</horizontalUncertainty>
<preferredDescription>horizontal uncertainty</preferredDescription>
</originUncertainty>
<quality>
<usedPhaseCount>9</usedPhaseCount>
<usedStationCount>9</usedStationCount>
<standardError>0.02</standardError>
<azimuthalGap>114</azimuthalGap>
<minimumDistance>0.008787</minimumDistance>
</quality>
<evaluationMode>automatic</evaluationMode>
<creationInfo>
<agencyID>NC</agencyID>
<creationTime>2015-04-20T13:10:09.370Z</creationTime>
<version>0</version>
</creationInfo>
</origin>
<magnitude catalog:datasource="nc" catalog:dataid="nc72431490" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml#magnitude">
<mag>
<value>0.29</value>
</mag>
<type>md</type>
<stationCount>1</stationCount>
<originID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml</originID>
<evaluationMode>automatic</evaluationMode>
<creationInfo>
<agencyID>NC</agencyID>
<creationTime>2015-04-20T13:10:09.370Z</creationTime>
</creationInfo>
</magnitude>
<preferredOriginID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml</preferredOriginID>
<preferredMagnitudeID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml#magnitude</preferredMagnitudeID>
<type>earthquake</type>
<creationInfo>
<agencyID>nc</agencyID>
<creationTime>2015-04-20T13:17:04.229Z</creationTime>
<version>0</version>
</creationInfo>
</event>
<creationInfo>
<creationTime>2015-04-20T13:31:33.000Z</creationTime>
</creationInfo>
</eventParameters>
</q:quakeml>
'
;WITH XMLNAMESPACES ('http://quakeml.org/xmlns/quakeml/1.2' AS q, DEFAULT 'http://quakeml.org/xmlns/bed/1.2')
INSERT INTO #HOLDER (MyDescription , Longitude , Magnitude , MagType )
SELECT
MyDescriptionType = Y.i.value('./description[1]/type[1]/.', 'varchar(64)')
, MyLongitude = Y.i.value('./origin[1]/longitude[1]/.', 'numeric(18,6)')
, MyMagValue = Y.i.value('./magnitude[1]/mag[1]/value[1]/.', 'varchar(64)')
, MagType = Y.i.value('./magnitude[1]/type[1]/.', 'varchar(64)')
FROM
@xmldoc.nodes('/q:quakeml/eventParameters/event') AS Y(i)
/* Optional */
/* CREATE CLUSTERED INDEX IDX_TempHolder_ID ON #Holder (ID) */
CREATE INDEX IDX_TempHolder_ID ON #Holder (ID)
/* HERE you go from #temp table to real table */
Insert into dbo.RealTable (Description , Longitude , Magnitude , MagType )
select MyDescription , Longitude , Magnitude , MagType from #Holder
IF OBJECT_ID('tempdb..#Holder') IS NOT NULL
begin
drop table #Holder
end
Какое отношение это имеет отношение к ASP.NET? – mason
@mason Я использовал процедуру хранения asp.net для вставки в db –
Нет такой вещи, как «ASP.NET Хранимая процедура». Хранимые процедуры - это концепция SQL Server, а не концепция веб-платформы. Соответственно, я удалил тег. – mason