2009-12-02 20 views
55

Se si dispone di un campo varchar, è possibile eseguire facilmente SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%' per verificare se tale colonna contiene una determinata stringa.Utilizzare un'istruzione LIKE su SQL Server. Tipo di dati XML

Come si fa per il tipo XML?

ho il seguente che restituisce solo le righe che hanno un nodo 'Testo', ma ho bisogno di cercare all'interno di quel nodo

select * from WebPageContent where data.exist('/PageContent/Text') = 1 
+2

possibile duplicato del [Il modo migliore per cercare i dati memorizzati come XML in Sql Server?] (http://stackoverflow.com/questions/52945/best-way-to-search-data-stored-as-xml-in-sql-server) –

risposta

53

Si dovrebbe essere in grado di farlo abbastanza facilmente:

SELECT * 
FROM WebPageContent 
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%' 

Il metodo .value fornisce il valore effettivo ed è possibile definirlo come VARCHAR(), che è possibile verificare con un'istruzione LIKE.

Intendiamoci, questo non sarà terribilmente veloce. Quindi, se si dispone di alcuni campi nel XML che è necessario per ispezionare un sacco, si potrebbe:

  • creare una funzione memorizzata che ottiene il codice XML e restituisce il valore che stai cercando come VARCHAR()
  • definire un nuovo campo calcolato sul vostro tavolo che chiama questa funzione, e renderlo una colonna PERSISTED

Con questo, si sarebbe sostanzialmente "estrarre" una certa porzione di XML in un campo calcolato, renderlo persisteva , e quindi puoi cercare in modo molto efficiente su di esso (diamine: puoi anche INDICE quel campo!).

Marc

+1

Fondamentalmente implemiamo una ricerca funzione quindi voglio cercare la colonna XML solo sui nodi 'Testo' e quindi restituire una sottostringa per indicare che la ricerca ha trovato una corrispondenza.Per esempio cerca su "ciao" invece di restituire l'intera colonna xml, vorrei solo restituire una sottostringa come "il tipo ha detto ciao e portato ..." – Jon

+1

Batti ad esso di 5 secondi. Un'altra possibilità è quella di considerare l'utilizzo della ricerca di testo libero, se i tuoi dati sono suscettibili ... – RickNZ

+6

per cercare l'intero file: WHERE xmlField.value ('.', 'Varchar (max)') LIKE '% FOO%' – jhilden

0

Questo è quello che ho intenzione di utilizzare in base marc_s risposta:

SELECT 
SUBSTRING(DATA.VALUE('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)'),PATINDEX('%NORTH%',DATA.VALUE('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)')) - 20,999) 

FROM WEBPAGECONTENT 
WHERE COALESCE(PATINDEX('%NORTH%',DATA.VALUE('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)')),0) > 0 

Return una sottostringa sulla ricerca in cui i criteri di ricerca esiste

+0

I bisogno di parametri per prevenire l'iniezione in qualche modo? – Jon

+2

ESSERE CONSAPEVOLI: quelle funzioni XML SONO sensibili alle maiuscole/minuscole - DATA.VALUE ** non funzionerà! Deve essere a **. Value (...) ** –

+1

Appena individuato che – Jon

10

Un'altra opzione è quella di cercare il XML come stringa convertendolo in una stringa e quindi utilizzando LIKE. Tuttavia, come una colonna calcolata non può far parte di una clausola in cui è necessario avvolgerlo in un altro SELEZIONA come questo:

SELECT * FROM 
    (SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x 
WHERE [XMLDataString] like '%Test%' 
23

Un'altra opzione è quella di lanciare l'XML come nvarchar, e poi cercare la stringa data come se il campo XML fosse un campo nvarchar.

SELECT * 
FROM Table 
WHERE CAST(Column as nvarchar(max)) LIKE '%TEST%' 

mi piace questa soluzione perché è pulito, facile da ricordare, difficile da rovinare, e può essere utilizzato come parte di una clausola dove.

EDIT: Come Cliff ne parla, si può usare:

... nvarchar se c'è personaggi che non si convertono a VARCHAR

+2

Ditto su quello, o nvarchar se ci sono caratteri che non lo fanno convertire in varchar SELECT * FROM Table WHERE CAST (colonna come nvarchar (max)) LIKE '% TEST%' –

+0

[Err] 42000 - [SQL Server] Conversione di uno o più caratteri da XML a fascicolazione di destinazione impossibile – digz6666

+0

[Err ] 22018 - [SQL Server] La conversione esplicita dal tipo di dati xml al testo non è consentita. – digz6666

Problemi correlati