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

SQL Server:konwersja warunkowa inline za pomocą XML?

Wygląda na to, że potrzebujesz wersji ISNUMERYCZNEJ funkcja dla danych XML.

Niestety taka wbudowana funkcja nie istnieje - więc będziesz musiał wymyślić własną alternatywę, dla której jest kilka opcji:

Jeśli jest to proces jednorazowy lub na małą skalę, dla którego wydajność nie jest krytyczna, możesz przetwarzać tabele wejściowe po jednym wierszu wewnątrz kursora, używając TRY...CATCH blok do obsługi nieprawidłowych rzutowań (nieprzetestowany):

DECLARE xmlCur CURSOR FOR
SELECT textcol 
FROM inputTable

OPEN xmlCur
DECLARE @string nvarchar(MAX)
DECLARE @xml xml

FETCH NEXT FROM xmlCur into @string

WHILE @@fetch_status = 0
BEGIN
    BEGIN TRY
        SET @xml = CAST(@string AS XML)
        -- Do something with XML
    END TRY
    BEGIN CATCH
        -- log failure/mark source row as invalid
    END CATCH

    FETCH NEXT FROM xmlCur into @string
END

CLOSE xmlCur
DEALLOCATE xmlCur 

Alternatywnie, jeśli znasz się na programowaniu .Net (i jest ono włączone na twoim serwerze), możesz użyć CLR aby utworzyć własną funkcję IsXML. Kod .Net musiałby być niewiele bardziej złożony niż trzeci post w tym wątku .

Wydajność rozwiązania CLR może nie być dużo lepsza niż kursora - musisz to przetestować.

(Oczywistą rzeczą do wypróbowania, która nie działa, jest funkcja T-SQL o wartościach skalarnych, która próbuje rzutować pole na XML wewnątrz TRY...CATCH blok. Jednak TRY...CATCH nie jest dozwolone wewnątrz funkcji.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PIVOT Zapytanie wielokrotnego łączenia

  2. Klauzula SQL WHERE dopasowująca wartości z końcowymi spacjami

  3. Dlaczego SQL Server ciągle tworzy ograniczenie DF?

  4. MS SQL Server 2005 — spontanicznie łamie się procedura składowana

  5. Jak mogę użyć instrukcji if po CTE (SQL Server 2005)