Основната идея около функцията на SQL Server, наречена STUFF, е обединяването на множество колони в една колона с по-голяма гъвкавост, отколкото функцията CONCAT би осигурила. Освен това STUFF може да се комбинира с други техники за някои интересни ефекти.
В тази статия ще проучим възможностите, които командата STUFF предоставя за специалистите по SQL база данни.
Функцията T-SQL STUFF
Нека първо да разгледаме официалната дефиниция на Microsoft за функцията STUFF:
Функцията STUFF вмъква низ в друг низ. Той изтрива определена дължина от знаци в първия низ в началната позиция и след това вмъква втория низ в първия низ в началната позиция.
По този начин, когато използвате командата STUFF, вие пренареждате данните в колоната.
Нека да разгледаме няколко примера.
Първият е изходът от командата STUFF – оригиналният низ ABCDEFG ще бъде напълнен с низа XXX.
SELECT STUFF('ABCDEFG',3,3,'XXX');
Ще анализираме този изход, за да разберем напълно командата STUFF:
Сега третият параметър е увеличен до стойности от 4,5,6.
SELECT STUFF('ABCDEFG',3,4,'XXX');
SELECT STUFF('ABCDEFG',3,5,'XXX');
SELECT STUFF('ABCDEFG',3,6,'XXX');
Обяснения за извикване на функции
Замяната се случва на третия знак от оригиналния низ ABCDEFG при всяко изпълнение. Единствената разлика е броят на знаците, посочени за изтриване чрез параметъра за дължина на изтриване .
По този начин, когато дължината на изтриване параметър от начална позиция параметърът е по-дълъг от оригиналния низ, данните са съкратени.
Например, нашият оригинален низ е дълъг 7 знака. Функцията STUFF започва от позиция 3 и работи за още 5 знака. Тъй като 8 е повече от оригиналната дължина на низа от 7, стойността се връща като ABXXX.
Многократно използване на STUFF в една и съща заявка
Можете да вложите командата STUFF в друга команда STUFF и да я използвате толкова пъти, колкото е необходимо. Въпреки това, трябва да помислите как се отразява на заявките на ниво производство. Всяко вложено извикване се изпълнява за всеки ред от върнатите данни.
SELECT STUFF(STUFF('ABCDEFG',1,1,'1'),7,1,'7') as StuffExample5;
В този пример първият знак от оригиналния низ е заменен със знака 1, а последният е заменен със знака 7.
STUFF и ForXML
ForXML е функция в SQL Server, която може да трансформира наборите от резултати от SQL заявки в резултати, форматирани в XML.
STUFF може също да се комбинира с друга функционалност на SQL Server като ForXML. Той помага да се консолидират данните за целите на отчитането. Да вземем следната структура на таблицата:
Да предположим, че искате отчет с 2 колони. Първата колона е USER_NAME , а втората е разделена със запетая роля колона за всяка роля, която потребителят притежава. Как би могло това да се постигне в чист T-SQL?
Изградете структурата на таблицата и вмъкнете данни:
CREATE TABLE
#USER
(
USER_ID INT,
USER_NAME VARCHAR(50)
)
CREATE TABLE
#USER_ROLES
(
USER_ID INT,
ROLE VARCHAR(50)
)
INSERT INTO #USER VALUES(1,'Edward')
INSERT INTO #USER VALUES(2,'John')
INSERT INTO #USER VALUES(3,'Mark')
INSERT INTO #USER_ROLES VALUES(1,'Admin')
INSERT INTO #USER_ROLES VALUES(1,'Writer')
INSERT INTO #USER_ROLES VALUES(1,'Form')
INSERT INTO #USER_ROLES VALUES(2,'Writer')
INSERT INTO #USER_ROLES VALUES(3,'Form')
INSERT INTO #USER_ROLES VALUES(3,'Writer');
Използвайте командата STUFF:
SELECT
U.USER_NAME,
STUFF((SELECT ',' + UR.ROLE
FROM #USER_ROLES UR
WHERE UR.USER_ID = U.USER_ID
FOR XML PATH('')), 1, 1, '') [ROLES]
FROM #USER U
GROUP BY U.USER_NAME, U.USER_ID
ORDER BY 1
В този пример вътрешна заявка се присъединява към всеки USER_ID. Командата STUFF се използва за замяна на началната запетая. В резултат на това имаме хубав списък, разделен със запетая, на всеки потребител със съответните роли.
Случаи на употреба
Маскиране на данни
SQL Server предоставя решения за динамично маскиране на данни. Въпреки това, STUFF може да се използва за замъгляване на чувствителни данни, когато се показва. Представете си изглед, стоящ отгоре на маса, която има полета за PII на клиента, като SSN. Изгледът може да използва командата STUFF, за да маскира всичко, с изключение на последните 4 цифри на SSN.
Консолидиране на данни
Както е показано с FORXML и STUFF, T-SQL предлага възможност за консолидиране на данни в единични колони с някакъв първичен идентификатор. В този пример това беше USER_NAME. Този тип анализ обаче е доста често срещан в архитектурата за отчитане на база данни.
Резюме
По този начин покрихме параметрите на командата STUFF в T-SQL и разбрахме как тази команда се сравнява с CONCAT. Демонстрирахме както прости, така и сложни примери за командата STUFF и изброихме няколко случая на употреба, за които STUFF може да бъде приложим.
Това е ценна команда, която може да бъде чудесен инструмент, който да имате под колана си. Моля, коментирайте с други случаи на използване на командата STUFF.