none
problemi nella ricerca in campi xml RRS feed

  • Domanda

  • Ciao a tutti, utilizzo la sintassi seguente per cercare del testo nel campo xml Notes:

    declare @string varchar(100)='lago'
    
    SELECT * from Event where Notes.exist('//*/text()[contains(lower-case(.), sql:variable("@string"))]')=1


    il campo è in questa forma:

    <Section xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
      <Paragraph>
        <Run xml:lang="it-it">lago</Run>
      </Paragraph>
    </Section>

    in questo modo cerco la parola 'lago' in qualsiasi nodo. Ho notato però che passando la stringa vuota mi trova comunque le righe contenenti del testo. Qualcuno saprebbe come evitare questo problema ?

    Grazie




    • Modificato Maxtii martedì 15 ottobre 2013 16:08
    • Tipo modificato Maxtii martedì 15 ottobre 2013 16:08
    martedì 15 ottobre 2013 16:02

Risposte

Tutte le risposte

  • Ciao,

    personalmente proverei a proporti una modifica del codice, in modo da sfruttare l'operatore LIK, che in questi casi viene particolarmente utile:

    DECLARE @string VARCHAR(100)='lago'
    DECLARE @SqlString NVARCHAR(MAX)
    SET @SqlString = 'SELECT * FROM Event WHERE Notes LIKE ''%' + @string + '%'''
    PRINT @SqlString
    EXECUTE(@SqlString)

    Questo tipo di query, essendo dinamica, deve essere "maneggiata con cura" per l'apertura che offre verso SQL Injections. Ad ogni modo, trattando preventivamente il dato in ingresso, non dovresti avere particolari problematiche. Un metodo alternativo potrebbe essere quello di creare una stored procedure basata su questo codice:

    CREATE PROCEDURE RicercaNote @string VARCHAR(100)
    AS
    BEGIN
        SET NOCOUNT ON
        SELECT * FROM Event WHERE Notes LIKE @string	
    END

    Con una procedura di questo tipo, potrai eseguirla in qualsiasi momento utilizzando la funzione EXEC e passando il parametro desiderato, completandolo con eventuali wildcards:

    EXEC RicercaNote '%lago%'


    Emiliano Musso

    mercoledì 16 ottobre 2013 07:31
  • Ciao,

    come da documentazione: "If the value of $arg2 is a zero-length string, the function returns True"

    http://technet.microsoft.com/en-us/library/ms178026.aspx

    Questo vuol dire che forse il controllo di stringa vuota dovresti farlo prima di eseguire la query se non vuoi tornare dati.


    Alessandro Alpi SQL Server MVP

    mercoledì 16 ottobre 2013 08:09
    Moderatore