Как заменить несколько значений, прочитанных из XML, и сохранить их в базе данных SQL - PullRequest
0 голосов
/ 17 октября 2019

Я работаю над хранимой процедурой, в которой мне нужно прочитать значения из файла XML и заменить эти значения на более понятный человеку формат, а затем сохранить их в базе данных. Например: значение в теге «NAT_FLAVOR» должно быть заменено на «Natural Flavor» и «ART_FLAVOR» на «Artificial Flavor», а затем его необходимо сохранить в базе данных.

   <FSPROJECTMATRIX_0>
        <PROJECT_CODE>O6UJ9A0000Z2</PROJECT_CODE>
        <DM_OBJECT_TYPE>PROJECT0</DM_OBJECT_TYPE>
        <FIELD1>1</FIELD1>
        <FIELD2>tEST123</FIELD2>
        <FIELD3 />
        <FIELD4>4</FIELD4>
        <FIELD5>OZ</FIELD5>
        <FIELD6>2019-03-27 05:00:00.000</FIELD6>
        <FIELD14>NAT_FLAVOR</FIELD14>
        <FIELD15 />
        <FIELD16>Q6UJ9A00O7X1</FIELD16>
        <FIELD17 />
    </FSPROJECTMATRIX_0>
    <FSPROJECTMATRIX_0>
        <PROJECT_CODE>O6UJ9A0000Z2</PROJECT_CODE>
        <DM_OBJECT_TYPE>PROJECT0</DM_OBJECT_TYPE>
        <FIELD1>1</FIELD1>
        <FIELD2>TES456</FIELD2>
        <FIELD3 />
        <FIELD4>4</FIELD4>
        <FIELD5>OZ</FIELD5>
        <FIELD6>2019-03-27 05:00:00.000</FIELD6>
        <FIELD14>ART_FLAVOR</FIELD14>
        <FIELD15 />
        <FIELD16>Q6UJ9A00O7X2</FIELD16>
        <FIELD17 />
    </FSPROJECTMATRIX_0>

IПопробовал IF-ELSE Statement, и он работает, если только один раз тег FSPROJECTMATRIX_0 появляется в файле. Если тег появляется несколько раз, я сталкиваюсь с проблемой.

DECLARE @COE_BUS_TEMP1 VARCHAR(100) = (SELECT fsxml.value('(FSPROJECT/C_BUSUNIT/text())[1]','VARCHAR(64)') FROM @fsxmlIN.nodes('/DataArea/fsxml') AS TEMPTABLE(fsxml))
DECLARE @COENATURALUS_11 VARCHAR(100) = (SELECT fsxml.value('(FIELD14/text())[1]','VARCHAR(100)') FROM @fsxmlIN.nodes('/DataArea/fsxml') AS TEMPTABLE(fsxml))
DECLARE @COENATURALEU_11 VARCHAR(100) = (SELECT fsxml.value('(FIELD17/text())[1]','VARCHAR(100)') FROM @fsxmlIN.nodes('/DataArea/fsxml') AS TEMPTABLE(fsxml))
DECLARE @SAMPLEUOM_TEMP1 VARCHAR(100) = (SELECT fsxml.value('(FIELD5/text())[1]','VARCHAR(100)') FROM @fsxmlIN.nodes('/DataArea/fsxml/FSPROJECT/FSPROJECTMATRIX_0') AS TEMPTABLE(fsxml))

IF @COE_BUS_TEMP1 = 'FRAGRANCE' OR @COE_BUS_TEMP1 = 'FLAVOR_US'
BEGIN
 IF @COENATURALUS_11 = 'NATURAL' SET @COENATURALUS_11 = 'All Natural'
 IF @COENATURALUS_11 = 'ART_FLAVOR' SET @COENATURALUS_11 = 'Artificial Flavor'
 IF @COENATURALUS_11 = 'NAT_ART' SET @COENATURALUS_11= 'Natural AND Artificial'
 IF @COENATURALUS_11 = 'NAT_FLAVOR' SET @COENATURALUS_11 = 'Natural Flavor'
 IF @COENATURALUS_11 = 'SYNTHETIC' SET @COENATURALUS_11 = 'Synthetic'
 IF @COENATURALUS_11 = 'UNKNOWN' SET @COENATURALUS_11 = 'Unknown'
END

Спасибо заранее, ребята.

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

вы можете использовать xpath, а скорее sql if-else-codition для изменения содержимого вашего xml.

SET @fsxmlIN.modify('replace value of (//FSPROJECT/FSPROJECTMATRIX_0/FIELD14[text()="NAT_FLAVOR"]/text())[1] with "Natural Flavor"')
SET @fsxmlIN.modify('replace value of (//FSPROJECT/FSPROJECTMATRIX_0/FIELD14[text()="NATURAL"]/text())[1] with "All Natural"')
SET @fsxmlIN.modify('replace value of (//FSPROJECT/FSPROJECTMATRIX_0/FIELD14[text()="NAT_ART"]/text())[1] with "Natural AND Artificial"')
SET @fsxmlIN.modify('replace value of (//FSPROJECT/FSPROJECTMATRIX_0/FIELD14[text()="ART_FLAVOR"]/text())[1] with "Artificial Flavor"')
SET @fsxmlIN.modify('replace value of (//FSPROJECT/FSPROJECTMATRIX_0/FIELD14[text()="SYNTHETIC"]/text())[1] with "Synthetic"')

select @fsxmlIN
0 голосов
/ 17 октября 2019

Альтернативные предложения:

  1. Сохраните XML как есть в таблице с именем FSPROJECTMATRIX_0, затем создайте представление SQL, которое выполняет замену на основе значения столбца. При этом сохраняются исходные значения полей, но не сохраняется исходный XML.

  2. Преобразование файла XML во временную таблицу или переменную таблицы, а затем замены при вставке данных в конечный пункт назначения. Таблица. SELECT INTO позволяет вводить в качестве SQL-запроса.

  3. Выполнить прямую замену строки в текстовом файле XML, включая тег <> xml, перед обработкой файла XML. Не рекомендуется.

  4. Если файл XML поступает с сервера SQL, выполните преобразование полей в источнике данных, а не в месте назначения данных. Например, выберите SQL-представление для извлечения данных. Кроме того, используйте формат, отличный от XML, поскольку он довольно медленный в SQL Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...