рд╕реАрдПрд▓рдЖрд░ рдХреЗ рдмрд┐рдирд╛ рдПрдордПрд╕ рдПрд╕рдХреНрдпреВрдПрд▓ рдкрд░ рдПрдХреНрд╕рдПрд╕рдПрд▓ рдкрд░рд┐рд╡рд░реНрддрди

рдХрднреА-рдХрднреА рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЕрдВрджрд░ рд╕реЗ рд╕реАрдзреЗ рдкрддреНрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдлрд▓рддрд╛ / рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдВ, рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд▓реЙрдЧ рдЖрджрд┐ред рдпрд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЬрдВрдЧрд▓реА, рдПрдХ рд░рд╛рдХреНрд╖рд╕реА рдмрд╛рдЗрдХ, рдПрдХ рдХреБрдЯрд┐рд▓-рддрд┐рд░рдЫрд╛ рд╕рдорд╛рдзрд╛рди, рдЖрджрд┐ - рд▓реЗрдХрд┐рди рдмрд╕ рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╣реИред

рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдкрддреНрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рд╕рд╛рджреЗ рдкрд╛рда рдореЗрдВ рдмрдирд╛рдИ рдЬрд╛рдиреА рд╣реИ, рдФрд░ рдореЗрд▓ рдХреЛ рдпрд╛ рддреЛ xp_sendmail, рдпрд╛ (рдФрд░ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ) COM рдореЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, CDO.Message) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, OLE sp_OAxxxx рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SQL рд░реИрдкрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреНрд╡рд░рд┐рдд рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ред

рд╡реЗ рджреЛрдиреЛрдВ рддрдм рддрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреЗрдВрдЯрдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдкрд░реНрдпрд╛рдкреНрдд рдЕрд░реНрдердкреВрд░реНрдг рд╕рд╛рдзрди рд╣реИрдВ, рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рд╢реВрдиреНрдп рдХреЗ рдкрд╛рд╕ рд╣реИ, рдФрд░ рд░рд┐рдкреЛрд░реНрдЯ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдкреБрд░рд╛рдиреЗ рд╕реНрдХреВрд▓ рдХреЗ рддрдХрдиреАрдХреА рдбрд┐рдкреНрд▓реЛрдорд╛ рджреНрд╡рд╛рд░рд╛ рдЦрдкрдд рд╣реЛрддреА рд╣реИ, рдЬреЛ

+-----------+--------------+--------------+
| | | |
| | | <EOT> |
+-----------+--------------+--------------+

рдЕрдЧрд░ рдПрдХ рд╕рдорд╛рди рдкреНрд░рд╛рд░реВрдк рддрдирд╛рд╡ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдХреБрдЫ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрддрд░ рд╕реЗ рдЖрд╡реЗрджрди рд╕реНрддрд░ рддрдХ "рдЙрднрд░", рддреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛:

рдЕрдХреНрд╕рд░, рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдЕрднреА рднреА рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдХрд╣рддреЗ рд╣реИрдВ, рдпрджрд┐ рдСрдбрд┐рдЯ рдЯреЗрдмрд▓ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ HTML рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдо рд╕реЗ рдХрдо рдиреНрдпреВрдирддрдо (рдХреЙрд░реНрдкреЛрд░реЗрдЯ) рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ - рдФрд░ рдпрд╣рд╛рдВ рдПрдХ рдЕрдкреНрд░рд┐рдп рджрд┐рдирдЪрд░реНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реБрд░реВ рд╣реЛ рд░рд╣реА рд╣реИ - рдЯреА-рдПрд╕рдХреНрдпреВрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдЪрдЯреАрдПрдордПрд▓ рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдмрд╣реБрдд рдердХрд╛рдК рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрджрд┐ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдореЗрд▓ рд░рд┐рдкреЛрд░реНрдЯреЗрдВ рд╣реИрдВ, рддреЛ рд░рд┐рдкреЛрд░реНрдЯ рд╕рдВрд░рдЪрдирд╛ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рд╣реИ, рдФрд░ рдбрд┐рдЬрд╛рдЗрди рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╕реАрдПрд╕рдПрд╕ рдлреИрд▓ рд░рд╣рд╛ рд╣реИред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрддрд░ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ, 20 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдПрдХ рдЕрджреНрднреБрдд XML / XSL рджреНрд╡рд┐рдзреНрд░реБрд╡реАрдп рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрддрдирд╛ рд╕реБрд╕рдВрдЧрдд рдХрд┐ рдЗрд╕рдХреЗ рдЕрдВрддрд┐рдо рдШрдЯрдХ рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рд╡рд░рдг рдХреЛ рдПрдордПрд╕рдбреАрдПрди рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрдврд╝рдиреЗ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмреАрдЪ рдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЦреИрд░, рд╕рдм рдареАрдХ рд╣реИ - рдЕрдВрдд рдореЗрдВ, рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдЬрд╛рдирдХрд╛рд░реА рднреА XML рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдФрд░ рдПрдордПрд╕ SQL тАЛтАЛрдореВрд▓ рд░реВрдк рд╕реЗ рдкрд┐рдЫрд▓реЗ 15 рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд░рддрд╛ рд╣реИред

рддреЛ, рд╕реБрдВрджрд░ рдЕрдХреНрд╖рд░ рд╕рд┐рд░реНрдл рдПрдХ рдкрддреНрдерд░ рдлреЗрдВрдХ рд░рд╣реЗ рд╣реИрдВ - рд╡рд╣ рд╕рдм рдЬреЛ рдЗрд╕ рдмрд╛рдЗрдХ рдореЗрдВ рдПрдХреНрд╕рдПрд╕рдПрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдвреВрдВрдврдирд╛ рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░, MS SQL рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реА рдмрд╛рдЗрдХ рдореЗрдВ рдПрдХ рдФрд░ OLE- рд╡реНрд╣реАрд▓ рд╣реЛрдЧрд╛ред

рд╕реНрдореГрддрд┐ рдореЗрдВ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЕрдлрд╡рд╛рд╣ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Microsoft.XMLDOM рд╣реИ, рдЬреЛ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорди рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╣реЗрдЬрд╣реЙрдЧ рдФрд░ рд╕рд╛рдВрдк рдХреЛ рдкрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХрд╛рдо рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛, рдкрд░рд┐рдгрд╛рдо рдЪреБрдирдирд╛, рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд░рдирд╛ рд╣реИред рд╕реНрдореГрддрд┐ рдкреНрд░рд╡рд╛рд╣рд┐рдд рди рдХрд░реЗрдВред

рд╣рдо рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реИрдВ, рдФрд░ sp_OACreate, sp_OAMethod, sp_OAGet / SetProperty рдФрд░ sp_OADestroy рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд┐рд╡рд░рдг рд╣реИ - рдЕрдЧрд░ рд╡рд┐рдзрд┐ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддреА рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╕реНрдХреЗрд▓рд░ рд╕рднреА рдЦрд░рд╛рдм рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдХреЗрд▓рд░ 8kB рдХреЗ рдореВрд▓рднреВрдд рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд╢реИрдХреНрд╖рд┐рдХ рд░рд╣реЗрдЧрд╛ - рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реА рд╕рджреА рдореЗрдВ 4 (8) рд╣рдЬрд╛рд░ рдЕрдХреНрд╖рд░реЛрдВ рдХрд╛ рдкрд░рд┐рдгрд╛рдореА рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣рдВрд╕реА рдХрд╛ рдкрд╛рддреНрд░ рд╣реИ, рдФрд░ рдмрд╕ рдЗрддрдирд╛ рд╣реАред

рд╣рдо рдПрдХ рд▓рдВрдмреЗ рднреВрд▓рднреБрд▓реИрдпрд╛ рд╕реЗ рдЧреБрдЬрд░реЗ, рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рдПрдХ рдХрджрдо рджреВрд░, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рдХрд╛рд╢ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмреИрдо! - рдПрдХ рдЬрд╛рд▓реА рджреНрд╡рд╛рд░рд╛ рдирд┐рдХрд╛рд╕ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред OLE рд░реИрдкрд░ рд╕реЗ 8K рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмреЗ рддрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред (N) varchar (MAX) рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреБрдЫ рдЕрд╢реНрд░рд╡реНрдп OLE рддреНрд░реБрдЯрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рддрд░рд╣ рд╣рдореЗрдВ рдРрд╕реА рдЪреАрдЬрд╝ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╕реНрдХреЗрд▓рд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд░рд┐рдЬрд▓реНрдЯ рдХрд╛ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ SQL рдХрд╛ рдкреЙрдЗрдВрдЯрд░ рд╕рд┐рд░реНрдл рдПрдХ рдирдВрдмрд░ рд╣реЛрддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рдПрдХ рд╕реВрдЪрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдордиреЛрдб рд╡рд┐рдзрд┐ рдХреЛ рдордЬрдмреВрд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдирд┐рд░рд╛рд╢ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо MSDN (рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рдСрдирд▓рд╛рдЗрди рд╣реИ) рдореЗрдВ рдЪрдврд╝рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ XMLDOM рдкрд┐рдЫрд▓реЗ 15 рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдЖ рд╣реИ - MS рдЕрдм рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдордиреЛрдбрдСрдмрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐ - BINGO рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ !!! рд╡рд┐рдзрд┐ рдЙрд╕ рд╕реВрдЪрдХ рдХреЛ рдзрд╛рд░рд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рд╕рд╛рдордЧреНрд░реА рдбрд╛рд▓рддрд╛ рд╣реИ!

рдлрд┐рд░ рдпрд╣ рд╕рд░рд▓ рд╣реИ - рд╣рдо рдПрдХ рд╕реНрдЯреНрд░реАрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╡рд┐рдзрд┐ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк - рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╕реНрдЯреНрд░реАрдо рдореЗрдВ - рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ред рдЗрд╕реЗ рд╕реНрдХреЗрд▓рд░ рдореЗрдВ рдХреИрд╕реЗ рдЦреАрдВрдЪреЗрдВ? рд╕рдореБрджреНрд░ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ 8KB рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдШреЗрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╕рдореБрджреНрд░ рдХреЛ рдЦрдВрдЧрд╛рд▓рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд┐рдЪрд░ (MAX) рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рд╕рдм рдХреБрдЫ рдШрдЯрд╛рдПрдВ, рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдХ) рдзрд╛рд░рд╛ рд╕реЗ рдЗрд╕рдХрд╛ рд╡рд░реНрддрдорд╛рди рдЖрдХрд╛рд░ рдкрдврд╝реЗрдВ - рдпрд╣ рдЙрди рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреА рдЬреЛ рд╣рдореЗрдВ рдЗрд╕рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЦ) рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рдбрд╛рд▓реЗрдВред рдЕрдиреНрдпрдерд╛, рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЦреИрд░, рдЖрдЦрд┐рд░рдХрд╛рд░, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╕рд╛рдл рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдХрд┐ рдЬреЛ рдХреБрдЫ рднреА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рд╡рд╣ рдирд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЧрд▓рддреА рдереА рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдпрджрд┐ рдпрд╣ рдерд╛, рддреЛ рдХреНрдпрд╛ рдЪрд░рдг рд╣реБрдЖред

рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

CREATE FUNCTION [dbo].[f_Helper_XSLTransform]
(
	@XMLData	XML,
	@XSLTemplate	XML
)
RETURNS NVARCHAR(MAX)
AS
BEGIN

	IF @XMLData IS NULL OR @XSLTemplate IS NULL
		RETURN 'XML or XSL data is NULL'
		 
	DECLARE	@OLEActionName	VARCHAR(128),
		@PropOrMethodName	VARCHAR(128)

	DECLARE @hr				INT, 
		@dummy			INT,
		@ObjXML			INT, 
		@ObjXSL			INT,
		@ObjStream		INT,
		@BuffSize			INT

	DECLARE @Result			NVARCHAR(MAX) = N'',
		@Chunk			NVARCHAR(4000),		-- VVVV should match VVVV
		@ChunkCharSize	INT = 4000,			-- ^^^^^^^^^^^^^^^^^^^^^^
		@ResultBuff		NVARCHAR(MAX) = N''	-- chunk concat buffer

	-- create XMLDOM object for @XMLData
	SET @OLEActionName 	= 'sp_OACreate'
	SET @PropOrMethodName 	= 'Microsoft.XMLDOM'
	
	EXEC @hr = sp_OACreate @PropOrMethodName, @ObjXML OUT
	IF @hr <> 0 
	GOTO FUN_ERROR

	-- create XMLDOM object for @XSLData
	EXEC @hr = sp_OACreate @PropOrMethodName, @ObjXSL OUT
	IF @hr <> 0 
		GOTO FUN_ERROR

	-- create ADODB.Stream object as transformation buffer
	SET @PropOrMethodName 	= 'ADODB.Stream'

	EXEC @hr = sp_OACreate @PropOrMethodName, @ObjStream OUT
	IF @hr <> 0 
		GOTO FUN_ERROR

	-- load XML data
	SET @OLEActionName 	= 'sp_OAMethod'
	SET @PropOrMethodName 	= 'LoadXML'

	EXEC @hr = sp_OAMethod @ObjXML, @PropOrMethodName, @dummy OUT, @XMLData
	IF @hr <> 0 
		GOTO FUN_ERROR

	-- load XSL data
	EXEC @hr = sp_OAMethod @ObjXSL, @PropOrMethodName, @dummy OUT, @XSLTemplate
	IF @hr <> 0 
		GOTO FUN_ERROR

	-- open the stream
	SET @PropOrMethodName 	= 'Open'
	
	EXEC @hr = sp_OAMethod @ObjStream, @PropOrMethodName, NULL
	IF @hr <> 0 
		GOTO FUN_ERROR

	-- trying to do XSL transformation, using the stream as the receiver to work around 4/8K limitation
	SET @PropOrMethodName 	= 'TransformNodeToObject'

	EXEC @hr = sp_OAMethod @ObjXML, @PropOrMethodName, NULL, @ObjXSL, @ObjStream
	IF @hr <> 0 
		GOTO FUN_ERROR

	-- get the size of the stream to read back
	SET @OLEActionName 	= 'sp_OAGetProperty'
	SET @PropOrMethodName 	= 'Size'
	
	EXEC @hr = sp_OAGetProperty @ObjStream, @PropOrMethodName, @BuffSize OUT
	IF @hr <> 0 
		GOTO FUN_ERROR

	-- re-position the stream to the head..
	SET @OLEActionName 	= 'sp_OASetProperty'
	SET @PropOrMethodName 	= 'Position'

	EXEC @hr = sp_OASetProperty @ObjStream, 'Position', 0	-- offset = 0
	IF @hr <> 0 
		GOTO FUN_ERROR

	-- ..and then read chunk by chunk
	SET @OLEActionName 	= 'sp_OAMethod'
	SET @PropOrMethodName 	= 'ReadText'

	WHILE @BuffSize > @ChunkCharSize
	BEGIN
		-- read chunk
		EXEC @hr = sp_OAMethod @ObjStream, @PropOrMethodName, @Chunk OUT, @ChunkCharSize
		IF @hr <> 0 
			GOTO FUN_ERROR
	
		-- append it to the accumulated buffer contents..
		SET @ResultBuff += @Chunk
		-- ..and correct the char counter by the # of chars retrieved
		SET @BuffSize -= @ChunkCharSize
	END

	-- read the last chunk
	EXEC @hr = sp_OAMethod @ObjStream, @PropOrMethodName, @Chunk OUT
	IF @hr <> 0 
		GOTO FUN_ERROR

	-- append the last chunk to the buffer
	SET @ResultBuff += @Chunk

	-- close the stream
	SET @PropOrMethodName = 'Close'
	EXEC @hr = sp_OAMethod @ObjStream, @PropOrMethodName, NULL
	IF @hr <> 0 
		GOTO FUN_ERROR

	-- everything is ok, copying buffer to result
	SET @Result = @ResultBuff
	
	-- resulting doc is in @Result, cleaning up and exiting..
	GOTO OLE_RELEASE

FUN_ERROR:

	SET @Result = '#### Error ' + CONVERT(VARCHAR, CONVERT(VARBINARY(4), @hr)) + ', Action ' + @OLEActionName + ', Method/Property ' + @PropOrMethodName + ' ####'
	-- fall through OLE release

OLE_RELEASE:

	-- destroying XML..
	SET @OLEActionName 	= 'sp_OADestroy'
	SET @PropOrMethodName 	= 'Microsoft.XMLDOM'
	IF ISNULL(@ObjXML, 0) <> 0
	BEGIN
		EXEC @hr = sp_OADestroy @ObjXML
		IF @hr <> 0 
			GOTO OLE_RELEASE_ERROR
	END

	-- ..and XSL objects
	IF ISNULL(@ObjXSL, 0) <> 0
	BEGIN	
		EXEC @hr = sp_OADestroy @ObjXSL
		IF @hr <> 0 
			GOTO OLE_RELEASE_ERROR
	END	 

	-- and the stream obj
	SET @PropOrMethodName 	= 'ADODB.Stream'
	IF ISNULL(@ObjStream, 0) <> 0
	BEGIN	
		EXEC @hr = sp_OADestroy @ObjStream
		IF @hr <> 0 
			GOTO OLE_RELEASE_ERROR
	END	 

	-- exiting with returning the resulting document
	RETURN @Result

OLE_RELEASE_ERROR:

	-- OLE release error, exiting with error info
	RETURN '#### Error ' + CONVERT(VARCHAR, CONVERT(VARBINARY(4), @hr)) + ', Action ' + @OLEActionName + ', Method/Property ' + @PropOrMethodName + ' ####'

END

рдЕрдм рдкреВрд░реЗ рд╕реЙрд╕реЗрдЬ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:

рдЯреЗрд╕реНрдЯ рдбреЗрдЯрд╛:

declare @xml xml = convert(xml, '<root><item id="1" name="john"/><item id="2" name="bob"/></root>')

рдЖрджрд┐рдо рдкреИрдЯрд░реНрди:

declare @templatetext varchar(max) = '<?xml version=''1.0'' encoding=''UTF-8''?>
						<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
						<xsl:template match = ''item''>
						<tr><td><xsl:value-of select = ''@id'' /></td><td><xsl:value-of select = ''@name'' /></td></tr>
						</xsl:template>
						<xsl:template match = ''/''>
							<HTML>
							  <BODY>
								<TABLE>
								  <TR><TD colspan=''2''>Item List</TD></TR>
								  <xsl:apply-templates select = ''root'' />
								</TABLE>
							  </BODY>
							</HTML>
						  </xsl:template>
						</xsl:stylesheet>'

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реЗ XML рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрдиреНрд╡рд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ:

declare @xsl xml = convert(xml, @templatetext)

select dbo.f_Helper_XSLTransform(@xml, @xsl)

рдФрд░ рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИ:

<HTML><BODY><TABLE><TR><TD colspan="2">Item List</TD></TR><tr><td>1</td><td>john</td></tr><tr><td>2</td><td>bob</td></tr></TABLE></BODY></HTML>

рдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рднреЗрдЬреЗрдВ (рдФрд░ рдЕрдЯреИрдЪрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рднреА - рдФрд░ рдкрд┐рдЫрд▓реЗ рдПрдХ - рдПрдХ рдЧрдВрджреЗ рд╣реИрдХ рдХреЗ рд╕рд╛рде), рдореИрдВ рдПрдХ рдФрд░ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЕрдЧрд░ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ

Source: https://habr.com/ru/post/undefined/


All Articles