Welcome to Sign in | Help
in Search

Parametrizarea unui nod in XML

Last post 05-14-2009, 7:58 PM by B_gd_n[ ]Sahlean. 6 replies.
Sort Posts: Previous Next
  •  05-13-2009, 5:31 PM 7159

    Parametrizarea unui nod in XML

    Salutare la toti,

    Am si eu o problema in SQL-ul urmator:

    declare @NODCautat as nvarchar(100)

    SET @NODCautat = 'Facturi'

    select (SELECT

    T.node.query('.')

    FROM Continut.nodes('//' + @NODCautat + '' ) as T(node) for XML auto, root ) as TXML

    FROM [LOG]

    WHERE

    (SELECT

    T.node.query('.')

    FROM Continut.nodes('//' + @NODCautat + '' ) as T(node) for XML auto, root ) IS NOT NULL

    Eroarea care o primesc este "The argument 1 of the XML data type method "nodes" must be a string literal."

    Am facut sapaturi si am ajuns la concluzia ca nu se poate parametra nodul cautat (@NODCautat ) in randul

    FROM Continut.nodes('//' + @NODCautat + '' ) as T(node) for XML auto, root ) IS NOT NULL

    In orice caz nu in forma asta, poate in alt mod, pe care nu il cunosc si poate ma ajutati voi. Ideea e ca tin mortis sa parametrez nodul, deoarece vreau sa il caut prin mai multe XML-uri (diferite ca structura) stocate in coloana unui tabel. Nodul il cunosc doar la momentul executiei.

    Am mai incercat o varianta cu un SQL dinamic, de genul:

    declare @SirSQL as nvarchar(max)

    declare @NOD as nvarchar(100)

    declare @Tabel as table(ColoanaXML xml)

    DECLARE @ParmDefinition nvarchar(500)

    set @NOD='FacturaDetalii'

    set @SirSQL=N'declare @Tabe as table(Col xml);

    insert into @Tabe

    SELECT (SELECT T.node.query(''.'')

    FROM Continut.nodes(''//'+ @NOD +''') as T(node) for XML auto, root )

    FROM [LOG] WHERE (SELECT

    T.node.query(''.'')

    FROM Continut.nodes(''//' + @NOD + ''') as T(node) for XML auto, root ) IS NOT NULL;'

    exec sp_executesql @SirSQL

    Insa nu stiu cum sa scot tabelul din parametrul @Tabe astfel incat sa-l pot folosi mai departe in interogari.

    Merci

     

     

     

  •  05-13-2009, 7:58 PM 7161 in reply to 7159

    Re: Parametrizarea unui nod in XML

    Referitor la ultima intrebare, se poate folosi argumentul "OUTPUT" de la sp_executesql asa cum se vede in exemplul urmator citat din Books Online :

    "
    DECLARE @IntVariable int;
    DECLARE @SQLString nvarchar(500);
    DECLARE @ParmDefinition nvarchar(500);
    DECLARE @max_title varchar(30);

    SET @IntVariable = 197;
    SET @SQLString = N'SELECT @max_titleOUT = max(Title)
    FROM AdventureWorks.HumanResources.Employee
    WHERE ManagerID = @level';
    SET @ParmDefinition = N'@level tinyint, @max_titleOUT varchar(30) OUTPUT';

    EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT;
    SELECT @max_title;

    "

    Gheorghe Ciubuc,SQL Server Influencer, MCP(SQL 2000), MCTS (SQL Server 2005) , OCA(Oracle 9i), Sybase(Brainbench)
  •  05-13-2009, 10:29 PM 7168 in reply to 7161

    Re: Parametrizarea unui nod in XML

    Merci de sugestie. Am incercat, insa imi da doua erori. Banuiala mea este ca nu imi accepta parametru de tip table cu OUTPUT. Erorile sunt:

    Msg 156, Level 15, State 1, Line 1

    Incorrect syntax near the keyword 'Table'.

    Msg 1087, Level 15, State 2, Line 1

    Must declare the table variable "@Tabe".

    Codul SQL modificat este:

     

    declare @SirSQL as nvarchar(max)

    declare @NOD as nvarchar(100)

    DECLARE @ParmDefinition nvarchar(500)

    declare @Tabel as table(ColoanaXML xml)

    set @NOD='FacturaDetalii'

    set @SirSQL=N'insert into @Tabe

    SELECT (SELECT

    T.node.query(''.'')

    FROM Continut.nodes(''//' + @NOD +''') as T(node) for XML auto, root )

    FROM [LOG]

    WHERE

    (SELECT

    T.node.query(''.'')

    FROM Continut.nodes(''//' + @NOD + ''') as T(node) for XML auto, root ) IS NOT NULL'

    SET @ParmDefinition=N'@Tabe as table(Col xml) OUTPUT';

    exec sp_executesql @SirSQL, @ParmDefinition, @Tabe=@Tabel OUTPUT;

    SELECT * FROM @Tabel

    Am uitat sa mentionez ca daca folosesc tabel temporar cu ##  merge varianta asta cu sql dinamic, numai ca nu ma incalzeste cu nimic, deoarece codul de mai sus vreau sa il pun intr-o functie si de acolo nu pot accesa tabele ##.

    Varianta cu tabel temporar (care merge) este cea de mai jos, dar ma lasa rece (si oricum nu imi place prea tare solutia):

    declare @SirSQL as nvarchar(max)

    declare @NOD as nvarchar(100)

    DECLARE @ParmDefinition nvarchar(500)

    declare @Tabel as table(ColoanaXML xml)

    set @NOD='FacturaDetalii'

    set @SirSQL=N'

    SELECT (SELECT

    T.node.query(''.'')

    FROM Continut.nodes(''//' + @NOD +''') as T(node) for XML auto, root ) as Rezultat INTO ##Temp

    FROM [LOG]

    WHERE

    (SELECT

    T.node.query(''.'')

    FROM Continut.nodes(''//' + @NOD + ''') as T(node) for XML auto, root ) IS NOT NULL'

    exec sp_executesql @SirSQL

    SELECT * FROM ##Temp

    Accept orice idee pentru a o testa. Multumesc.

  •  05-13-2009, 10:46 PM 7169 in reply to 7168

    Re: Parametrizarea unui nod in XML

    fmihai:

    DECLARE @ParmDefinition nvarchar(500)

    declare @Tabel as table(ColoanaXML xml)



    vad aici variabila tabel cu o singura coloana, de ce n-ar merge o simpla variabila de tip XML ?

    Gheorghe Ciubuc,SQL Server Influencer, MCP(SQL 2000), MCTS (SQL Server 2005) , OCA(Oracle 9i), Sybase(Brainbench)
  •  05-13-2009, 11:42 PM 7170 in reply to 7169

    Re: Parametrizarea unui nod in XML

    :)))) Arata beton ceea ce se genereaza. Este practic un "XML de XML-uri" daca imi e permisa exprimarea, unde fiecare nod din XML-ul de baza contine un atribut care inglobeaza cate un XML. Codul SQL care merge fara probleme ar fi (l-am scurtat un pic):

    declare @SirSQL as nvarchar(max)

    declare @NOD as nvarchar(100)

    DECLARE @ParmDefinition nvarchar(500)

    declare @Tabel as xml

    set @NOD='FacturaDetalii'

    set @SirSQL=N'SELECT @Tabe=

    (

    SELECT (SELECT

    T.node.query(''.'')

    FROM Continut.nodes(''//' + @NOD +''') as T(node) FOR XML AUTO ,ROOT(''TAB'') ) as COL

    FROM [LOG] FOR XML AUTO, ROOT )

    '

    SET @ParmDefinition=N'@Tabe as xml OUTPUT';

    exec sp_executesql @SirSQL, @ParmDefinition, @Tabe=@Tabel OUTPUT;

    SELECT @Tabel as Nume

    Mai jos este o mostra din rezultat :

    <root>
      <LOG COL="<TAB><T><FacturaDetalii><NrFactura>1</NrFactura><CodProdus>2</CodProdus><Cantitate>15</Cantitate><Pret>14.7000</Pret></FacturaDetalii></T><T><FacturaDetalii><NrFactura>1</NrFactura><CodProdus>1</CodProdus><Cantitate>10</Cantitate><Pret>12.5000</Pret></FacturaDetalii></T></TAB>" />
    </root>
     
       Parca as mai cauta solutie si la prima varianta propusa.  
  •  05-14-2009, 4:17 PM 7175 in reply to 7170

    Re: Parametrizarea unui nod in XML

    intrebare scurta..(scuza banalitatea)

    in codul urmator:

    SELECT (SELECT

    T.node.query(''.'')

    FROM Continut.nodes(''//' + @NOD +''') as T(node)

    ce inseamna       T(node) ?
    ce fel de alias este? nu gasesc nici o referite pe google


    merci si scuze de deranj


  •  05-14-2009, 7:58 PM 7180 in reply to 7175

    Re: Parametrizarea unui nod in XML

    Nu-i deranj.

    nodes() Method
    Syntax

    nodes (XQuery) as Table(Column)

View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems