Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak zoptymalizować SQL 'XQuery'

Jeśli chcesz mieć tylko jedną wartość z każdego wiersza, nie ma potrzeby używania cross apply .

select XMLCol.value('(/*[local-name()=sql:variable("@Root")]
                      /*[local-name(.)=sql:variable("@Entity")]
                      /*[local-name(.)=sql:variable("@ParentNode")]
                      /*[local-name(.)=sql:variable("@Separator")]
                      /*[local-name(.)=sql:variable("@ChildNode")])[1]', 'varchar(max)')
from XMLTable

Innym sposobem na osiągnięcie tego samego jest użycie FLWOR . W moich ograniczonych testach będzie to działać nieco szybciej.

select XMLCol.value('(for $n1 in /*,
                          $n2 in $n1/*,
                          $n3 in $n2/*,
                          $n4 in $n3/*,
                          $n5 in $n4/*
                      where $n1[local-name(.) = sql:variable("@Root")] and
                            $n2[local-name(.) = sql:variable("@Entity")] and
                            $n3[local-name(.) = sql:variable("@ParentNode")] and
                            $n4[local-name(.) = sql:variable("@Separator")] and
                            $n5[local-name(.) = sql:variable("@ChildNode")]
                      return $n5
                     )[1]', 'varchar(max)')
from XMLTable



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pobierz arkusz Excela do tabeli tymczasowej za pomocą skryptu

  2. Partycjonowana tabela sprawdzania serwera SQL

  3. Pojawia się dziwny błąd, zapytanie SQL Server przy użyciu klauzuli `WITH`

  4. Jak uzyskać wartość od step1 do step2 w sql Job

  5. System.Data.SqlTypes.SqlTypeException:przepełnienie SqlDateTime