Как импортировать импорт пустых тегов XML в столбец Number таблицы с помощью хранимой процедуры - PullRequest
0 голосов
/ 08 ноября 2019

Я создал хранимую процедуру, которая преобразует файл XML в таблицу данных SQL Server. Это хорошо работает, когда в каждом теге есть значения для числовых столбцов, но не работает, если тег пуст. Есть ли способ преобразовать пробел в ноль или способ игнорировать пробелы в хранимой процедуре? Вот упрощенная версия процедуры.

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [dbo].[SHPReportDataXML] 
    @XML XML
AS 
    INSERT dbo.SHPReportData ([Weight], [WeightUQ]) 
        SELECT
            [Weight] = SHPReportData.value('(RawDataItem/Weight)[1]', 'DECIMAL(10, 2)'),
            [WeightUQ] = SHPReportData.value('(RawDataItem/UQ)[1]', 'VARCHAR(2)')
        FROM
            @XML.nodes('RawData') c (SHPReportData);

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

Принятое решение работает, но это можно сделать лучше:

- XML ​​содержит одно десятичное значение, один пустой узел и один узел с пробелом.
- Добавьте узел с помощьюнекалиброванное значение "привет", чтобы проверить методы с этим тоже.

DECLARE @xml XML=N'<a>123.456</a>
                   <a/>
                   <a>   </a>';

--add one more with a non-castable value
--                   <a>hello</a>';

- Подход "постановка": прочитайте строку и продолжите извне

SELECT a.value('text()[1]','nvarchar(max)') worksInAnyCase
FROM @xml.nodes('/a') A(a)

-Подход с безопасным типом завершится неудачей для недесятичных знаков

SELECT a.value('text()[1]','decimal(6,3)') FailsForHello
FROM @xml.nodes('/a') A(a)

- здесь может помочь приведение XQuery

SELECT a.value('text()[1] cast as xs:decimal?','decimal(6,3)') WorksImplicitly
FROM @xml.nodes('/a') A(a)

- TRY_CAST также помогает (требуется v2012 +)

SELECT TRY_CAST(a.value('text()[1]','nvarchar(max)') AS DECIMAL(6,3)) castedIfPossible
FROM @xml.nodes('/a') A(a)

- NULLIF тоже может помочь, но привет пройдет мимо

SELECT NULLIF(a.value('text()[1]','nvarchar(max)'),'') NullForBlanks
FROM @xml.nodes('/a') A(a)

- Принятое решение не работает и для приветствия

SELECT CASE WHEN ISNULL(a.value('text()[1]', 'VARCHAR(15)'),'') = '' THEN NULL ELSE CAST(a.value('text()[1]', 'VARCHAR(15)') AS decimal(6,3)) END FailsForHello
FROM @xml.nodes('/a') A(a)

Моим любимым был кастом XQuery .. .

0 голосов
/ 09 ноября 2019

Я предполагаю, что вы получаете 0 или ошибки преобразования для строк с этим тегом, содержащим пустую строку.
Вы можете уничтожить XML до значения varchar, а затем выполнить проверку и преобразование типов в TSQL:

 SELECT
    [Weight] =
       CASE WHEN ISNULL(SHPReportData.value('(RawDataItem/Weight)[1]', 'VARCHAR(15)'),'') = '' THEN NULL
       ELSE CAST(SHPReportData.value('(RawDataItem/Weight)[1]', 'VARCHAR(15)') AS DECIMAL(10,2)) END,
     [WeightUQ] = SHPReportData.value('(RawDataItem/UQ)[1]', 'VARCHAR(2)')
  FROM
     @XML.nodes('RawData') c (SHPReportData);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...