Pchełki SQL: Długie stringi

https://xpil.eu/P2JtM

W dzisiejszym odcinku Pchełek SQL zobaczymy, jak poradzić sobie z zapisywaniem długich stringów w kodzie T-SQL.

Jeżeli ktoś zasugerował się pod wpływem tytułu, że wpis dotyczyć będzie fikuśnej mody bieliźnianej, muszę go srodze rozczarować. Lub ją. Jedyne stringi, o jakich będziemy dziś pisać, to literały.

Lite Rały.

Czyli ciągi znaków wzięte w ciapki. Po naszemu - w apostrofy. Czyli ciapki.

Wyobraźmy sobie na przykład taki scenariusz: ktoś nam podsyła (emailem) zapytanie ad-hoc, czy wymienione przez niego kody istnieją w jakiejś tam tabeli. O, tak:

From: Antoni Pieróg
To: Xpil Xpilowski
Subject: sprawdź mi proszę te kody

Siemanko. Możesz proszę sprawdzić, czy mamy w systemie któryś z tych kodów?

RMZ722,XFI730,WKL772,QBO646,LSG572,HSB352,JQQ948,MCF343,PPL371,VKN744,UMK992,SMR168,QSZ242,ESZ612,OSN812,EAE395,MWF999,CGT600,SYQ988,HXM950,PKV179,KPS657,XWG159,QGH179,FST147,XYV475,CMH820,NIN776,TES517,VLB153,XSA590,TJV677,AMU501,PZW192,FVF077,BUF353,PVM139,ZWI203,SDC875,LZM342,MRL568,VWB267,SIE685,UOR212,HPE667,GHR091,CAC406,QOL158,MHD196,VVC472,CZN127,XRN551,ZCU495,JOY051,FOD580,XUW559,RAD479,WXF784,MLY219,JIP946,TRE386,LGZ869,ZFR823,NIT332,HIF261,IOB285,ARO893,EIM735,AFY602,LOI927,NGJ198,MQZ376,OEM190,BRK152,CCK757,ING035,VFN702,ZVG429,YSS544,PXO571,EIL292,LMT270,MDF283,QMX313,ULT045,MMI064,OSE951,UWJ702,NYR991,AHQ068,CDT201,KQE168,RXI374,QFW902,WIT996,QXI355,HIT088,LQH152,JGR627,WTY270,YTH307,MFQ212,TII856,MVF526,VRV274,CRS723,TEP844,JWO776,KEI046,YYF684,ZGZ253,CSV820,PLV287,DUO368,ONT715,YGP854,OJA794,RUS341,YWD151,DJP064,MRK811,KWQ760,PUO230,VER528,TKA848,FTE660,VQF644,PIC716,NKA036,ULI013,MTT887,HMX900,HDO080,BNY129,EMY042,SRI145,TXO465,OZG800,WYY272,MFY880,WDJ297,JBQ475,ATY175,CLS929,HMQ443,ADL813,RHV812,ZXO076,XMV566,WPF368,SGL196,UVN891,VUE045,ATR896,OQX157,VRR725,NIT830,CUK034,GGS480,ECH034,RBI374,QWA580,KYC497,PUM196,DBD356,EXL593,XZO815,JAD479,NUR702,EWT121,BMF108,ZLX557,ABU511,QIW590,HCV203,YIL614,PPK150,SUQ069,JPE091,WOS613,UNK716,QNW640,DJW257,SNX086,QQW663,RUD795,NJJ164,IWV037,JTC143,VED617,UBJ558,AWY664,JHK079,DUE983,AEU579,EIW419,KQS384,UOF050,EXW661,DQU663,ZJG677,ZXT057,MAL631,TRB269,GFQ936,DMB271,QPN232,PJJ401,IKQ439,MTK795,OIK569,CKK355,YJY209,VLX237,NVO489,RPG505,YYM696,GPK199,FNX985,DEN077,WHL560,NAM787,DBK747,YDJ242,TSZ596,BTI786,BQZ243,LMW379,PPY999,QUC285,PDR761,HVO700,RKO802,SUC463,KTK573,QWB806,KSQ411,XCN287,BTD616,PXD779,GNT957,ZZW462,USY930,OAA841,MFF774,MPC236,NKQ612,QKO557,DAO171,PFE862,MBZ026,LQP627,RPN018,BAJ712,VTQ587,JSG872,KVR087,LDE118,RWP631,ZZW496,RQP576,PKZ366,IAA946,WAK508,CTG479,UQM130,ZYR683,CPX973,GZO441,LIL856,DOL363,PWB677,XDU398,VLE502,IDT967,CHH859,RGZ664,OBC527,DXR070,VCA089,ABD186,VDR981,LSI714,YCL476,GBV558,DAO180,JTE540,CRG896,BXK261,LSY540,IUJ113,SFA374,GZY350,PWC179,JTJ405,DHD633,OPE634,XPS658,ZDK678,ASY956,HIP318,TDW506,PMQ052,TZM579,POB751,LJT295,QHR442,FZJ307,DRD775,ICG598,TEI796,ZHR211,GFA861,GYX383,BLQ939,MTT632,PAO373,NMQ052,PST216,UYR020,VOW885,XXT514,HFI127,DNR541,CPX665,OPC124,UCO645,NZK189,NIB494,VWV594,YYI584,MDS928,SZL486,MKK206,YDC016,NUV804,EVH135,ONS410,AJH965,ZRB659,DVP305,FQB209,ZDQ578,DUL518,TAP834,CXP471,NCS110,ANF101,QFY289,PBJ979,SPD776,SNB293,DPN082,TDI782,HPV636,OMM334,ARC718,IFC677,EYB826,DUJ030,SZC477,RQV264,LBI509,TYN994,YOI967,DRJ432,CUR492,NYN034,VLK105,SEW482,OFX297,ZDD387,SCT189,YMZ247,HEI449

Dzięki,
A.

Możemy załatwić sprawę w sposób tradycyjny i zapuścić takie zapytanie:

SELECT * FROM JakasWaznaTabela WHERE BardzoIstotnyKod IN ('RMZ722', 'XFI730', 'WKL772', 'QBO646', 'LSG572', 'HSB352', 'JQQ948', 'MCF343', 'PPL371', 'VKN744', 'UMK992', 'SMR168', 'QSZ242', 'ESZ612', 'OSN812','EAE395', 'MWF999', 'CGT600', 'SYQ988', 'HXM950', 'PKV179', 'KPS657', 'XWG159', 'QGH179', 'FST147', 'XYV475', 'CMH820', 'NIN776', 'TES517', 'VLB153','XSA590', 'TJV677', 'AMU501', 'PZW192', 'FVF077', 'BUF353', 'PVM139', 'ZWI203', 'SDC875', 'LZM342', 'MRL568', 'VWB267', 'SIE685', 'UOR212', 'HPE667','GHR091', 'CAC406', 'QOL158', 'MHD196', 'VVC472', 'CZN127', 'XRN551', 'ZCU495', 'JOY051', 'FOD580', 'XUW559', 'RAD479', 'WXF784', 'MLY219', 'JIP946','TRE386', 'LGZ869', 'ZFR823', 'NIT332', 'HIF261', 'IOB285', 'ARO893', 'EIM735', 'AFY602', 'LOI927', 'NGJ198', 'MQZ376', 'OEM190', 'BRK152', 'CCK757','ING035', 'VFN702', 'ZVG429', 'YSS544', 'PXO571', 'EIL292', 'LMT270', 'MDF283', 'QMX313', 'ULT045', 'MMI064', 'OSE951', 'UWJ702', 'NYR991', 'AHQ068','CDT201', 'KQE168', 'RXI374', 'QFW902', 'WIT996', 'QXI355', 'HIT088', 'LQH152', 'JGR627', 'WTY270', 'YTH307', 'MFQ212', 'TII856', 'MVF526', 'VRV274','CRS723', 'TEP844', 'JWO776', 'KEI046', 'YYF684', 'ZGZ253', 'CSV820', 'PLV287', 'DUO368', 'ONT715', 'YGP854', 'OJA794', 'RUS341', 'YWD151', 'DJP064','MRK811', 'KWQ760', 'PUO230', 'VER528', 'TKA848', 'FTE660', 'VQF644', 'PIC716', 'NKA036', 'ULI013', 'MTT887', 'HMX900', 'HDO080', 'BNY129', 'EMY042','SRI145', 'TXO465', 'OZG800', 'WYY272', 'MFY880', 'WDJ297', 'JBQ475', 'ATY175', 'CLS929', 'HMQ443', 'ADL813', 'RHV812', 'ZXO076', 'XMV566', 'WPF368','SGL196', 'UVN891', 'VUE045', 'ATR896', 'OQX157', 'VRR725', 'NIT830', 'CUK034', 'GGS480', 'ECH034', 'RBI374', 'QWA580', 'KYC497', 'PUM196', 'DBD356','EXL593', 'XZO815', 'JAD479', 'NUR702', 'EWT121', 'BMF108', 'ZLX557', 'ABU511', 'QIW590', 'HCV203', 'YIL614', 'PPK150', 'SUQ069', 'JPE091', 'WOS613','UNK716', 'QNW640', 'DJW257', 'SNX086', 'QQW663', 'RUD795', 'NJJ164', 'IWV037', 'JTC143', 'VED617', 'UBJ558', 'AWY664', 'JHK079', 'DUE983', 'AEU579','EIW419', 'KQS384', 'UOF050', 'EXW661', 'DQU663', 'ZJG677', 'ZXT057', 'MAL631', 'TRB269', 'GFQ936', 'DMB271', 'QPN232', 'PJJ401', 'IKQ439', 'MTK795','OIK569', 'CKK355', 'YJY209', 'VLX237', 'NVO489', 'RPG505', 'YYM696', 'GPK199', 'FNX985', 'DEN077', 'WHL560', 'NAM787', 'DBK747', 'YDJ242', 'TSZ596','BTI786', 'BQZ243', 'LMW379', 'PPY999', 'QUC285', 'PDR761', 'HVO700', 'RKO802', 'SUC463', 'KTK573', 'QWB806', 'KSQ411', 'XCN287', 'BTD616', 'PXD779','GNT957', 'ZZW462', 'USY930', 'OAA841', 'MFF774', 'MPC236', 'NKQ612', 'QKO557', 'DAO171', 'PFE862', 'MBZ026', 'LQP627', 'RPN018', 'BAJ712', 'VTQ587','JSG872', 'KVR087', 'LDE118', 'RWP631', 'ZZW496', 'RQP576', 'PKZ366', 'IAA946', 'WAK508', 'CTG479', 'UQM130', 'ZYR683', 'CPX973', 'GZO441', 'LIL856','DOL363', 'PWB677', 'XDU398', 'VLE502', 'IDT967', 'CHH859', 'RGZ664', 'OBC527', 'DXR070', 'VCA089', 'ABD186', 'VDR981', 'LSI714', 'YCL476', 'GBV558','DAO180', 'JTE540', 'CRG896', 'BXK261', 'LSY540', 'IUJ113', 'SFA374', 'GZY350', 'PWC179', 'JTJ405', 'DHD633', 'OPE634', 'XPS658', 'ZDK678', 'ASY956','HIP318', 'TDW506', 'PMQ052', 'TZM579', 'POB751', 'LJT295', 'QHR442', 'FZJ307', 'DRD775', 'ICG598', 'TEI796', 'ZHR211', 'GFA861', 'GYX383', 'BLQ939','MTT632', 'PAO373', 'NMQ052', 'PST216', 'UYR020', 'VOW885', 'XXT514', 'HFI127', 'DNR541', 'CPX665', 'OPC124', 'UCO645', 'NZK189', 'NIB494', 'VWV594','YYI584', 'MDS928', 'SZL486', 'MKK206', 'YDC016', 'NUV804', 'EVH135', 'ONS410', 'AJH965', 'ZRB659', 'DVP305', 'FQB209', 'ZDQ578', 'DUL518', 'TAP834','CXP471', 'NCS110', 'ANF101', 'QFY289', 'PBJ979', 'SPD776', 'SNB293', 'DPN082', 'TDI782', 'HPV636', 'OMM334', 'ARC718', 'IFC677', 'EYB826', 'DUJ030','SZC477', 'RQV264', 'LBI509', 'TYN994', 'YOI967', 'DRJ432', 'CUR492', 'NYN034', 'VLK105', 'SEW482', 'OFX297', 'ZDD387', 'SCT189', 'YMZ247', 'HEI449')

Napisanie tego kodu wymaga jednak przeklejenia oryginalnej listy do Excela, rozdzielenia jej na kolumny wg przecinków, dodanie ciapków, dodanie przecinków i przeklejenia wyniku do SSMS. Nie, żeby miało nas to zabić, ale jednak trochę klikania i kombinowania jest. Poza tym polegamy na tym, że Antoni Pieróg starannie porozdzielał w swojej wiadomości wszystkie kody przecinkami, co nie musi być prawdą, albowiem - jak mówi stare, eskimoskie przysłowie: "Errare Pierogarum Est"

Zamiast tego można zrobić o, tak:

SELECT * FROM JakasWaznaTabela WHERE CHARINDEX(BardzoIstotnyKod,
'RMZ722, XFI730, WKL772, QBO646, LSG572, HSB352, JQQ948, MCF343, PPL371, VKN744, UMK992, SMR168, QSZ242, ESZ612, OSN812,\
EAE395, MWF999, CGT600, SYQ988, HXM950, PKV179, KPS657, XWG159, QGH179, FST147, XYV475, CMH820, NIN776, TES517, VLB153,\
XSA590, TJV677, AMU501, PZW192, FVF077, BUF353, PVM139, ZWI203, SDC875, LZM342, MRL568, VWB267, SIE685, UOR212, HPE667,\
GHR091, CAC406, QOL158, MHD196, VVC472, CZN127, XRN551, ZCU495, JOY051, FOD580, XUW559, RAD479, WXF784, MLY219, JIP946,\
TRE386, LGZ869, ZFR823, NIT332, HIF261, IOB285, ARO893, EIM735, AFY602, LOI927, NGJ198, MQZ376, OEM190, BRK152, CCK757,\
ING035, VFN702, ZVG429, YSS544, PXO571, EIL292, LMT270, MDF283, QMX313, ULT045, MMI064, OSE951, UWJ702, NYR991, AHQ068,\
CDT201, KQE168, RXI374, QFW902, WIT996, QXI355, HIT088, LQH152, JGR627, WTY270, YTH307, MFQ212, TII856, MVF526, VRV274,\
CRS723, TEP844, JWO776, KEI046, YYF684, ZGZ253, CSV820, PLV287, DUO368, ONT715, YGP854, OJA794, RUS341, YWD151, DJP064,\
MRK811, KWQ760, PUO230, VER528, TKA848, FTE660, VQF644, PIC716, NKA036, ULI013, MTT887, HMX900, HDO080, BNY129, EMY042,\
SRI145, TXO465, OZG800, WYY272, MFY880, WDJ297, JBQ475, ATY175, CLS929, HMQ443, ADL813, RHV812, ZXO076, XMV566, WPF368,\
SGL196, UVN891, VUE045, ATR896, OQX157, VRR725, NIT830, CUK034, GGS480, ECH034, RBI374, QWA580, KYC497, PUM196, DBD356,\
EXL593, XZO815, JAD479, NUR702, EWT121, BMF108, ZLX557, ABU511, QIW590, HCV203, YIL614, PPK150, SUQ069, JPE091, WOS613,\
UNK716, QNW640, DJW257, SNX086, QQW663, RUD795, NJJ164, IWV037, JTC143, VED617, UBJ558, AWY664, JHK079, DUE983, AEU579,\
EIW419, KQS384, UOF050, EXW661, DQU663, ZJG677, ZXT057, MAL631, TRB269, GFQ936, DMB271, QPN232, PJJ401, IKQ439, MTK795,\
OIK569, CKK355, YJY209, VLX237, NVO489, RPG505, YYM696, GPK199, FNX985, DEN077, WHL560, NAM787, DBK747, YDJ242, TSZ596,\
BTI786, BQZ243, LMW379, PPY999, QUC285, PDR761, HVO700, RKO802, SUC463, KTK573, QWB806, KSQ411, XCN287, BTD616, PXD779,\
GNT957, ZZW462, USY930, OAA841, MFF774, MPC236, NKQ612, QKO557, DAO171, PFE862, MBZ026, LQP627, RPN018, BAJ712, VTQ587,\
JSG872, KVR087, LDE118, RWP631, ZZW496, RQP576, PKZ366, IAA946, WAK508, CTG479, UQM130, ZYR683, CPX973, GZO441, LIL856,\
DOL363, PWB677, XDU398, VLE502, IDT967, CHH859, RGZ664, OBC527, DXR070, VCA089, ABD186, VDR981, LSI714, YCL476, GBV558,\
DAO180, JTE540, CRG896, BXK261, LSY540, IUJ113, SFA374, GZY350, PWC179, JTJ405, DHD633, OPE634, XPS658, ZDK678, ASY956,\
HIP318, TDW506, PMQ052, TZM579, POB751, LJT295, QHR442, FZJ307, DRD775, ICG598, TEI796, ZHR211, GFA861, GYX383, BLQ939,\
MTT632, PAO373, NMQ052, PST216, UYR020, VOW885, XXT514, HFI127, DNR541, CPX665, OPC124, UCO645, NZK189, NIB494, VWV594,\
YYI584, MDS928, SZL486, MKK206, YDC016, NUV804, EVH135, ONS410, AJH965, ZRB659, DVP305, FQB209, ZDQ578, DUL518, TAP834,\
CXP471, NCS110, ANF101, QFY289, PBJ979, SPD776, SNB293, DPN082, TDI782, HPV636, OMM334, ARC718, IFC677, EYB826, DUJ030,\
SZC477, RQV264, LBI509, TYN994, YOI967, DRJ432, CUR492, NYN034, VLK105, SEW482, OFX297, ZDD387, SCT189, YMZ247, HEI449') > 0

Co się tutaj wydarza?

Otóż cytujemy tutaj jeden dłuuugi tekst (string), ale "łamiemy" go wizualnie na kilkanaście linii za pomocą odwrotnego ukośnika, zwanego popularnie backslash-em.
W tej sposób nie musimy kombinować z Excelem, zajmie nam to ułamek oryginalnego czasu, kod SQL będzie bardziej czytelny, a wynik będzie ten sam. I pan Pieróg będzie mógł od razu kontynuować swoją pracę w Dziale Pozyskiwania Stolca.

Żeby zilustrować działanie tego nieszczęsnego ukośnika, podam jeszcze jeden, dużo prostszy przykład:

Zapytanie:

SELECT 'A
B'

zwróci na wyjściu:

A
B

(Żeby to sprawdzić, trzeba sobie w SSMS przełączyć wyświetlanie wyników z siatki na tekst - czyli prawomysz -> Output To -> Text, ewentualnie z klawiatury: Ctrl-T. Powrót do "normalności" odbywa się za pomocą Ctrl-D)

Natomiast zapytanie:

SELECT 'A\
B'

zwróci:

AB

I pomyśleć, że do niedawna żyłem bez tej wiedzy.

Niezwykłe.

https://xpil.eu/P2JtM

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.