Я собираюсь предположить, что под «переменными» вы ссылаетесь на XML атрибуты и что вы пытаетесь получить имя и значение атрибута. Используя ваши образцы данных, вы можете сделать это следующим образом:
DECLARE @XML XML = '
<var name="ENDA6012E0891_1"><string>N</string></var><var name="SAFETYRAILSTEPS_1"><string>Y</string></var><var name="HOMEVACANT_1"><string>N</string></var>';
SELECT
AttribName = a.Attrib.value('local-name(.)','varchar(8000)'),
AttribValue = a.Attrib.value('.','varchar(8000)')
FROM @XML.nodes('//@*') AS a(Attrib);
Возвращает:
AttribName AttribValue
----------- -------------------
name ENDA6012E0891_1
name SAFETYRAILSTEPS_1
name HOMEVACANT_1
Для таблицы вы можете сделать это:
-- Sample Data
DECLARE @t TABLE (SomeId INT IDENTITY, SomeXML XML);
INSERT @t(SomeXML)
VALUES('<var name="ENDA6012E0891_1"></var><var name="SAFETYRAILSTEPS_1"></var><var name="HOMEVACANT_1"></var>'),
('<var dog="Blood Hound"></var><var cat="Orange One"></var><var creature="Dragon"></var><xxx color="pink"/>');
-- Solution
SELECT
SomeId = t.SomeId,
AttribName = a.Attrib.value('local-name(.)','varchar(8000)'),
AttribValue = a.Attrib.value('.','varchar(8000)')
FROM @t AS t
CROSS APPLY t.SomeXML.nodes('//@*') AS a(Attrib);
Возвращает:
SomeId AttribName AttribValue
----------- ----------- -------------------
1 name ENDA6012E0891_1
1 name SAFETYRAILSTEPS_1
1 name HOMEVACANT_1
2 dog Blood Hound
2 cat Orange One
2 creature Dragon
2 color pink
С другой стороны: ваша функция repetitiveReplace (или Regex) не является инструментом для такого рода - используя SQL Собственный сервер * Поддержка 1044 * - XML - самое простое и эффективное решение. Тем не менее, я недавно создал аналогичную функцию, которая делает то же самое, но немного более мощный. Я написал это как T- SQL хвостовая рекурсия Функция высшего порядка Обычно я не фанат скалярных UDF, но этот парень прекрасно работает как скалярная встроенная функция, если у вас SQL Server 2019. Обратите внимание, что это всего 3 строки кода.
PowerStuff32:
CREATE FUNCTION dbo.PowerStuff32
(
@String VARCHAR(8000),
@Seek VARCHAR(100),
@StLen TINYINT,
@StWith VARCHAR(10)
)
/****************************************************************************************
Written by Alan Burstein 20200304
Note: This is a beta version of this function. It's a recursive scalar UDF and will error
out on 32 iterations. Add a counter for protection.
Note this example:
DECLARE @String VARCHAR(1000) =
'Call me at 555-2233, 555 3344 or 1.800.555.6678 about case number 00234. Thanks!';
SELECT f1.Txt
FROM (VALUES(dbo.PowerStuff32(@string,
'%[0-9][0-9][0-9]_[0-9][0-9][0-9][0-9]%',8,'<REMOVED>'))) AS f1(Txt);
*****************************************************************************************/
RETURNS VARCHAR(8000) WITH RETURNS NULL ON NULL INPUT AS BEGIN RETURN
(
SELECT CHOOSE(st.C, @String, dbo.PowerStuff32(st.Txt,@Seek,@StLen,@StWith))
FROM (VALUES(PATINDEX(@Seek,@String))) AS nxt(D)
CROSS APPLY (VALUES(STUFF(@String,nxt.D,@StLen,@StWith),SIGN(nxt.D)+1)) AS st(Txt,C)
);
END;
Пример (заменить номера телефонов текстом «Удалено»):
DECLARE @String VARCHAR(1000) =
'Call me at 555-2233, 555 3344 or 1.800.555.6678 about case number 00234. Thanks!';
SELECT f1.Txt
FROM (VALUES(dbo.PowerStuff32(@string,
'%[0-9][0-9][0-9]_[0-9][0-9][0-9][0-9]%',8,'{REMOVED}'))) AS f1(Txt);
Возвращает:
Позвоните мне по адресу {УДАЛЕНО}, {УДАЛЕНО} или 1800. {УДАЛЕНО}, номер дела 00234 Спасибо!