αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ MS SQL αž–αžΈ Powershell αž›αžΎαž›αžΈαž“αž»αž…

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αžŸαž»αž‘αŸ’αž’αžŸαžΆαž’ αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž§αž‘αŸ’αž‘αž·αžŸαžŠαž›αŸ‹αžšαžΏαž„αžŸαŸ„αž€αžŸαŸ…αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†

αž€αžΆαžšαžαŸ’αžšαŸ€αž˜αžαŸ’αž›αž½αž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Zero Touch PROD αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ RDS (MS SQL) αžŠαŸ‚αž›β€‹αžαŸ’αžšαž…αŸ€αž€β€‹αžšαž”αžŸαŸ‹β€‹αž™αžΎαž„β€‹αž‘αžΆαŸ†αž„β€‹αž’αžŸαŸ‹β€‹αž€αŸ†αž–αž»αž„β€‹αžαŸ‚β€‹αž‰αžΆαž”αŸ‹β€‹αž‰αŸαžš αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αž’αŸ’αžœαžΎβ€‹αž”αž‘β€‹αž”αž„αŸ’αž αžΆαž‰ (POC - Proof Of Concept) αž“αŸƒβ€‹αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜αŸ– αžŸαŸ†αžŽαž»αŸ†β€‹αž“αŸƒβ€‹αžŸαŸ’αž‚αŸ’αžšαžΈαž” powershellαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž’αŸ’αžœαžΎαž”αž‘αž”αž„αŸ’αž αžΆαž‰ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αž™αž›αŸ‹αž–αŸ’αž™αž»αŸ‡ αžŸαŸ†αž‘αŸαž„αž‘αŸ‡αžŠαŸƒαž’αžΌαžŸαž”αž“αŸ’αž›αžΆαž™αž”αžΆαž“αž”αžΆαžαŸ‹αž”αž„αŸ‹αž‡αžΈαžœαž·αž αž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆαž€αžΆαžšαž’αž”αž’αžšαžŸαžΆαž‘αžšαž₯αžαžˆαž”αŸ‹αžˆαžš αž–αž½αž€αž‚αŸαž”αžΆαž“αž”αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αžαžΆ αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž›αŸ’αž’ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ‚αž αŸαžαž»αž•αž›αž˜αž“αŸ„αž‚αž˜αžœαž·αž‡αŸ’αž‡αžΆαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž‘αžΆαžŸαž€αžš Jenkins αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎαž›αžΈαž“αž»αž…!

αžαžΎαž“αŸαŸ‡αž’αžΆαž…αž‘αŸ…αžšαž½αž…αž‘αŸ? αž™αž€αž…αž„αŸ’αž€αŸ€αž„ DBA αž–αžΈαž€αŸ’αžšαŸ„αž˜ Windows αž αžΎαž™αž”αž·αž‘αžœαžΆαž€αŸ’αž“αž»αž„αž€αŸ†αžŠαŸ…αžαŸ’αž›αžΆαŸ†αž„αž“αŸƒ powershell αž“αŸ…αž€αŸ’αžšαŸ„αž˜αž›αžΈαž“αž»αž…? αžαžΎαž“αŸαŸ‡αž˜αž·αž“αžƒαŸ„αžšαžƒαŸ…αž‘αŸαž¬?

αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ MS SQL αž–αžΈ Powershell αž›αžΎαž›αžΈαž“αž»αž…
αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαžαŸ‚αž‡αŸ’αžšαž˜αž»αž‡αžαŸ’αž›αž½αž“αžαŸ’αž‰αž»αŸ†αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαžŠαŸαž…αž˜αŸ’αž›αŸ‚αž€αž“αŸƒαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαž“αŸαŸ‡αŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αžŸαŸ’αž‚αŸ’αžšαžΈαž” 30+ αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž”αžΆαž“αžˆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αž‡αžΆαž€αžΆαžšαž—αŸ’αž‰αžΆαž€αŸ‹αž•αŸ’αž’αžΎαž›αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‡αž½αžŸαž‡αž»αž›αž’αŸ’αžœαžΈαŸ—αž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž˜αž½αž™αžαŸ’αž„αŸƒαž’αŸ’αžœαžΎαž€αžΆαžšαŸ” αžαŸ’αž‰αž»αŸ†β€‹αž€αŸ†αž–αž»αž„β€‹αžŸαžšαžŸαŸαžšβ€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αžŸαŸ’αžœαŸ‚αž„αžšαž€β€‹αž€αŸ’αžαŸ…αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžαžΎαž’αŸ’αž“αž€αž’αžΆαž…αž‡αž½αž”αž”αŸ’αžšαž‘αŸ‡αž”αž‰αŸ’αž αžΆαž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡αž“αŸ…αž–αŸαž›αž•αŸ’αž‘αŸαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž” powershell αž–αžΈ Windows αž‘αŸ… Linux?

sqlcmd αž‘αž›αŸ‹αž“αžΉαž„ Invoke-SqlCmd

αžαŸ’αž‰αž»αŸ†αžŸαžΌαž˜αžšαŸ†αž›αžΉαž€αž’αŸ’αž“αž€αž’αŸ†αž–αžΈαž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžŸαŸ†αžαžΆαž“αŸ‹αžšαžœαžΆαž„αž–αž½αž€αž‚αŸαŸ” αž§αž”αž€αžšαžŽαŸαž…αžΆαžŸαŸ‹αž›αŸ’αž’αŸ” sqlcmd αžœαžΆαž€αŸαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αžšαŸ„αž˜αž›αžΈαž“αž»αž…αž•αž„αžŠαŸ‚αžš αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž˜αž»αžαž„αžΆαžšαžŸαŸ’αž‘αžΎαžšαžαŸ‚αžŠαžΌαž…αž‚αŸ’αž“αžΆαž”αŸαŸ‡αž”αž·αž‘αŸ” αž™αžΎαž„αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžŸαŸ†αžŽαž½αžšαžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· -Q αž―αž€αžŸαžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‡αžΆ -i αž“αž·αž„αž›αž‘αŸ’αž’αž•αž›αž‡αžΆ -o αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž‡αžΆβ€‹αž€αžΆαžšβ€‹αž–αž·αžβ€‹αžŽαžΆαžŸαŸ‹β€‹αžˆαŸ’αž˜αŸ„αŸ‡β€‹αž―αž€αžŸαžΆαžšβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž‡αžΆβ€‹αž’αž€αŸ’αžŸαžšβ€‹αžαžΌαž…β€‹αž’αŸ†αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αŸ’αžšαžΎ -i αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαžŸαžšαžŸαŸαžšαž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹:

GO
EXIT

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž·αž“αž˜αžΆαž“ EXIT αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž‘αŸαž“αŸ„αŸ‡ sqlcmd αž“αžΉαž„αž”αž“αŸ’αžαžšαž„αŸ‹αž…αžΆαŸ†αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž› αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž»αž“αŸ” αž…αžΆαž€αž…αŸαž‰ αž“αžΉαž„αž˜αž·αž“ GOαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αžΉαž„αž˜αž·αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αŸαŸ” αž―αž€αžŸαžΆαžšαž›αž‘αŸ’αž’αž•αž›αž˜αžΆαž“αž›αž‘αŸ’αž’αž•αž›αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ សអរ αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αŸ”αž›αŸ”

Invoke-SqlCmd αž”αž„αŸ’αž€αžΎαžαž›αž‘αŸ’αž’αž•αž›αž‡αžΆ DataSet, DataTables ឬ DataRows αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž€αžΆαžšαž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžŸαžΆαž˜αž‰αŸ’αž‰αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎ sqlcmdαžŠαŸ„αž™αž”αžΆαž“αž‰αŸ‚αž€αž›αž‘αŸ’αž’αž•αž›αžšαž”αžŸαŸ‹αžœαžΆ αžœαžΆαžŸαŸ’αž‘αžΎαžšαžαŸ‚αž˜αž·αž“αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αŸ– αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆαž˜αžΆαž“ αž αŸ…-SqlCmd. αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸ’αžšαž»αž˜αž“αŸαŸ‡αž€αŸαž˜αžΆαž“αžšαžΏαž„αž€αŸ†αž”αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αž•αž„αžŠαŸ‚αžšαŸ–

  • αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž•αŸ’αž‘αŸαžšαž―αž€αžŸαžΆαžšαž‘αŸ…αž“αžΆαž„αžαžΆαž˜αžšαž™αŸˆ - αž―αž€αžŸαžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž…αžΆαž€αž…αŸαž‰ αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αžœαžΆαž”αž„αŸ’αž€αžΎαžαž€αŸ†αž αž»αžŸαžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’
  • - αž―αž€αžŸαžΆαžšαž›αž‘αŸ’αž’αž•αž› αž‘αŸ αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αžΉαž„αžαŸ’αžšαž‘αž”αŸ‹αž’αŸ’αž“αž€αž“αžΌαžœαž›αž‘αŸ’αž’αž•αž›αž‡αžΆαžœαžαŸ’αžαž»αž˜αž½αž™αŸ”
  • αž˜αžΆαž“αžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž–αžΈαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ– -ServerInstance -αžˆαŸ’αž˜αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ -Password -Database αž“αž·αž„αžαžΆαž˜αžšαž™αŸˆ - αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžš. αž…αž˜αŸ’αž›αŸ‚αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž αžΎαž™ αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŠαŸ†αž”αžΌαž„αžœαžΆαž˜αž·αž“αž’αžΆαž…αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž…αŸ’αžšαž€αž€αŸ’αžšαŸ…αž–αžΈ 1433 αž”αžΆαž“αž‘αŸαŸ”
  • αž›αž‘αŸ’αž’αž•αž›αž’αžαŸ’αžαž”αž‘ αžœαžΆαž™ PRINT αžŠαŸ‚αž›αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚ "αž…αžΆαž”αŸ‹αž”αžΆαž“" sqlcmdαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ αž αŸ…-SqlCmd αž‚αžΊαž‡αžΆαž”αž‰αŸ’αž αžΆ
  • αž αžΎαž™αžŸαŸ†αžαžΆαž“αŸ‹αž”αŸ†αž•αž»αžαŸ– αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž‘αŸ†αž“αž„αž‡αžΆαž›αžΈαž“αž»αž…αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž˜αž·αž“αž˜αžΆαž“ cmdlet αž“αŸαŸ‡αž‘αŸ!

αž αžΎαž™αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž”αž‰αŸ’αž αžΆαž…αž˜αŸ’αž”αž„αŸ” αž˜αžΆαž“αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ‚αž˜αžΈαž“αžΆαž“αŸαŸ‡ cmdlet αž’αžΆαž…αž”αŸ’αžšαžΎαž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαŸαž‘αž·αž€αžΆαžŠαŸ‚αž›αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαžœαžΈαž“αžŠαžΌαž αžΎαž™αž‘αžΈαž”αŸ†αž•αž»αžαž™αžΎαž„αž’αžΆαž…αžˆαžΆαž“αž‘αŸ…αž˜αž»αžαž”αžΆαž“!

αž€αžΆαžšαž‡αŸ†αž“αž½αžŸαž’αžαŸαžš

sqlcmd αž˜αžΆαž“αž€αžΆαžšαž‡αŸ†αž“αž½αžŸαž’αžαŸαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎ -v αž§αž‘αžΆαž αžšαžŽαŸαžŠαžΌαž…αž“αŸαŸ‡αŸ–

# $conn содСрТит Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ sqlcmd
$cmd = $conn + " -i D:appsSlaveJobsKillSpid.sql -o killspid.res 
  -v spid =`"" + $spid + "`" -v age =`"" + $age + "`""
Invoke-Expression $cmd

αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž” SQL αž™αžΎαž„αž”αŸ’αžšαžΎαž€αžΆαžšαž‡αŸ†αž“αž½αžŸαŸ–

set @spid=$(spid)
set @age=$(age)

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„ * nix αž€αžΆαžšαž‡αŸ†αž“αž½αžŸαž’αžαŸαžšαž˜αž·αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αŸαŸ”. αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš -v αž˜αž·αž“αž’αžΎαž–αžΎαŸ” αž™αžΌ αž αŸ…-SqlCmd αž˜αž·αž“αž’αžΎαž–αžΎ - ធថេរ. αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŠαŸ‚αž›αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž’αžαŸαžšαžαŸ’αž›αž½αž“αž―αž„αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžΎαž–αžΎαž€αŸαžŠαŸ„αž™ αž€αžΆαžšαž‡αŸ†αž“αž½αžŸαžαŸ’αž›αž½αž“αž―αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš - αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž’αžαŸαžšαžŽαžΆαž˜αž½αž™αž–αžΈαžŸαŸ‚αž›αŸ” αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž€αžΆαžšαž’αžΆαž€αŸ‹αž’αž“αŸ‹αž…αž·αžαŸ’αžαž…αŸ†αž–αŸ„αŸ‡αž’αžαŸαžš αž αžΎαž™αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž˜αž·αž“αž–αžΉαž„αž•αŸ’αž’αŸ‚αž€αž›αžΎαž–αž½αž€αžœαžΆαž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡ αž αžΎαž™αž”αžΆαž“αž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αžαžŠαŸ„αž™αžˆαŸ’αž›αžΎαž™ αž“αž·αž„αžŠαžΎαž˜ αžŠαŸ„αž™αžŸαžΆαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž” SQL αžαŸ’αž›αžΈαŸ–

# prepend the parameters  
"declare @age int, @spid int" | Add-Content "q.sql"
"set @spid=" + $spid | Add-Content "q.sql"
"set @age=" + $age | Add-Content "q.sql"

foreach ($line in Get-Content "Sqlserver/Automation/KillSpid.sql") { 
  $line | Add-Content "q.sql" 
  }
$cmd = "/opt/mssql-tools/bin/" + $conn + " -i q.sql -o res.log"

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž™αž›αŸ‹ αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αžšαž½αž…αž αžΎαž™αž–αžΈαž€αŸ†αžŽαŸ‚ Unix αŸ”

αž€αŸ†αž–αž»αž„αž•αŸ’αž‘αž»αž€αž―αž€αžŸαžΆαžš

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚αžœαžΈαž“αžŠαžΌ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŽαžΆαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž˜αžŠαŸ„αž™αžŸαžœαž“αž€αž˜αŸ’αž˜αž˜αž½αž™αŸ– αž™αžΎαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš sqlcmd αž”αžΆαž“αž‘αž‘αž½αž›αž€αžΆαžšαž”αŸ†αž–αžΆαž“αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž›αž‘αŸ’αž’αž•αž› αž—αŸ’αž‡αžΆαž”αŸ‹αž―αž€αžŸαžΆαžšαž“αŸαŸ‡αž‘αŸ…αž…αžΆαž“αžŸαžœαž“αž€αž˜αŸ’αž˜αŸ” αž‡αžΆαžŸαŸ†αžŽαžΆαž„αž›αŸ’αž’ αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ SQL αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαžΌαž…αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™ Jenkins αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αŸ–

CREATE procedure AuditUpload
  @id int, @filename varchar(256)
as
  set nocount on
  declare @sql varchar(max)

  CREATE TABLE #multi (filer NVARCHAR(MAX))
  set @sql='BULK INSERT #multi FROM '''+@filename
    +''' WITH (ROWTERMINATOR = '' '',CODEPAGE = ''ACP'')'
  exec (@sql)
  select @sql=filer from #multi
  update JenkinsAudit set multiliner=@sql where ID=@id
  return

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž™αžΎαž„αž›αŸαž”αž―αž€αžŸαžΆαžš BCP αž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„ αž αžΎαž™αžšαž»αž‰αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž› nvarchar(αž’αžαž·αž”αžšαž˜αžΆ) αž“αŸƒαžαžΆαžšαžΆαž„αžŸαžœαž“αž€αž˜αŸ’αž˜αŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αžΆαŸ†αž„αž˜αžΌαž›αž“αŸαŸ‡αž”αžΆαž“αžŠαž½αž›αžšαž›αŸ†αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ SQL αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž‘αž‘αž½αž›αž”αžΆαž“ RDS αž αžΎαž™ BULK INSERT αž˜αž·αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡αžαžΆαž˜αžšαž™αŸˆ UNC αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž€αžΆαžšαž”αŸ‰αž»αž“αž”αŸ‰αž„αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž€αŸ‹αžŸαŸ„αž•αŸ’αžαžΆαž…αŸ‹αž˜αž»αžαž›αžΎαž―αž€αžŸαžΆαžšαž˜αž½αž™ αž αžΎαž™αž‡αžΆαž˜αž½αž™ RDS αž“αŸαŸ‡αž‡αžΆαž‘αžΌαž‘αŸ…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ†αž•αŸ’αž›αžΆαž‰αž–αžΈ αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αžŸαž˜αŸ’αžšαŸαž…β€‹αž…αž·αžαŸ’αžβ€‹αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšβ€‹αž€αžΆαžšβ€‹αžšαž…αž“αžΆβ€‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’ αžŠαŸ„αž™β€‹αžšαž€αŸ’αžŸαžΆβ€‹αž”αž“αŸ’αž‘αžΆαžαŸ‹β€‹αžŸαžœαž“αž€αž˜αŸ’αž˜β€‹αžαžΆαž˜β€‹αž”αž“αŸ’αž‘αžΆαžαŸ‹αŸ–

CREATE TABLE AuditOut (
  ID int NULL,
  TextLine nvarchar(max) NULL,
  n int IDENTITY(1,1) PRIMARY KEY
  )

αž αžΎαž™αžŸαžšαžŸαŸαžšαž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„αžŠαžΌαž…αž“αŸαŸ‡αŸ–

function WriteAudit([string]$Filename, [string]$ConnStr, 
     [string]$Tabname, [string]$Jobname)
{
  # get $lastid of the last execution  -- проскипано для ΡΡ‚Π°Ρ‚ΡŒΠΈ
	
  #create grid and populate it with data from file
  $audit =  Get-Content $Filename
  $DT = new-object Data.DataTable   

  $COL1 =  new-object Data.DataColumn; 
  $COL1.ColumnName = "ID"; 
  $COL1.DataType =  [System.Type]::GetType("System.Int32") 

  $COL2 =  new-object Data.DataColumn; 
  $COL2.ColumnName = "TextLine"; 
  $COL2.DataType =  [System.Type]::GetType("System.String") 
  
  $DT.Columns.Add($COL1) 
  $DT.Columns.Add($COL2) 
  foreach ($line in $audit) 
    { 
    $DR = $dt.NewRow()   
    $DR.Item("ID") = $lastid
    $DR.Item("TextLine") = $line
    $DT.Rows.Add($DR)   
    } 

  # write it to table
  $conn=new-object System.Data.SqlClient.SQLConnection 
  $conn.ConnectionString = $ConnStr
  $conn.Open() 
  $bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $ConnStr
  $bulkCopy.DestinationTableName = $Tabname 
  $bulkCopy.BatchSize = 50000
  $bulkCopy.BulkCopyTimeout = 0
  $bulkCopy.WriteToServer($DT) 
  $conn.Close() 
  }  

αžŠαžΎαž˜αŸ’αž”αžΈαž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžαŸ’αž›αžΉαž˜αžŸαžΆαžš αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžαžΆαž˜αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹ αžŠαŸ„αž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžαžΆαž˜αž›αŸ†αžŠαžΆαž”αŸ‹ n (αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽ)αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αžšαŸ€αž”αžšαžΆαž”αŸ‹αž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž˜αžΆαž“αž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™ Jenkins αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹