Удаление повторяющихся и действительно избыточных пространств имен - PullRequest
1 голос
/ 19 октября 2011

В следующем коде это утверждение;

declare namespace pd="http://cargowise.com/ediEnterprise/2011/10/11/systemUsage.xsd

повторяется 6 раз, что делает код действительно запутанным и трудным для понимания:

SELECT XW_PK, xw_ExeVersion, xw_enterpriseCode, xw_DatabaseCode, xw_CompanyCode,
    Poodle.Love.value('declare namespace pd="http://cargowise.com/ediEnterprise/2011/10/11/systemUsage.xsd";
    (pd:action/@name)[1]', 'varchar(100)') Name,
    Poodle.Love.value('declare namespace pd="http://cargowise.com/ediEnterprise/2011/10/11/systemUsage.xsd";
    (pd:action/@started)[1]', 'varchar(100)') [Started],
    Poodle.Love.value('declare namespace pd="http://cargowise.com/ediEnterprise/2011/10/11/systemUsage.xsd";
    (pd:action/@ended)[1]', 'varchar(100)') [Ended],
    Poodle.Love.value('declare namespace pd="http://cargowise.com/ediEnterprise/2011/10/11/systemUsage.xsd";
    (pd:action/@Elapsed)[1]', 'varchar(100)') Elapsed,
    Poodle.Love.value('declare namespace pd="http://cargowise.com/ediEnterprise/2011/10/11/systemUsage.xsd";
    (pd:action/@elapsedWithChildren)[1]', 'varchar(100)') elapsedWithChildren
    FROM   stmusage
        CROSS APPLY xw_rawData.nodes('declare namespace pd="http://cargowise.com/ediEnterprise/2011/10/11/systemUsage.xsd";
        /pd:performanceMeasurement/pd:action') as Poodle(Love)

Я хочу объявитьПространство имен только один раз и покончим с этим.Проблема в том, что каждый из xqueries встроен в строку - и я не совсем уверен - но опыт, который я приобрел за эти годы, создает у меня подавляющее впечатление, что эти строки не будут взаимодействовать с каждымдругие в ближайшее время.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2012
SELECT 
            XMLTable.actions.value('(@name)', 'varchar(100)') Name,
            XMLTable.actions.value('(@started)', 'datetime') [Started],
            XMLTable.actions.value('(@started)', 'datetime') + 
            convert(float, replace (replace (XMLTable.actions.value('(@elapsedWithChildren)', 'varchar(100)'),'PT',''),'S','')) / (60 * 60 * 24) Ended, --dodgy floating point rounding errors
            convert(float, replace (replace (XMLTable.actions.value('(@elapsed)', 'varchar(100)'),'PT',''),'S','')) Elapsed,
            convert(float, replace (replace (XMLTable.actions.value('(@elapsedWithChildren)', 'varchar(100)'),'PT',''),'S','')) ElapsedWithChildren,
            XMLTable.actions.value('@moduleId','varchar(100)') moduleid,
            XMLTable.actions.value('@actionCount','int') actionCount,
            XW_PK, XW_ExeVersion, XW_EnterpriseCode, XW_DatabaseCode, XW_CompanyCode, ExportType
            FROM StmUsage
                CROSS APPLY xw_rawData.nodes('declare namespace pd="http://cargowise.com/ediEnterprise/2011/10/11/systemUsage.xsd";
                /pd:performanceMeasurement/pd:action') XMLTable(actions)
            cross join (select 'Elapsed' ExportType union select 'ElapsedWithChildren') ExportTypeAlias

Легко как!

0 голосов
/ 19 октября 2011

Я не знаю язык программирования, на котором вы пишете, но на любом другом языке я бы написал функцию, которая принимает строку «имя» или «запускается» в качестве параметра PPPPP и выдает

Poodle.Love.value ('объявить пространство имен d = "http://cargowise.com/ediEnterprise/2011/10/11/systemUsage.xsd"; (pd: action / @ {PPPPP}) [1] ',' varchar (100) ')

как результат.

...