powershell – 使用Invoke-SQLCMD,SMO或SQLConnection更好

我一直在创建一些power
shell脚本,而且我主要使用Invoke-Sqlcmd作为查询数据库或输入.sql文件的方法,但是我在使用包含访问和查杀过程时遇到了一些麻烦.

我一直在使用SMO来杀死进程

$SQlSvr1 = New-Object Microsoft.SqlServer.Management.Smo.Server $serverInstance
$SQlSvr1.KillAllprocesses($databaseMain)

然后使用Invoke-Sqlcmd运行我的进程,它一直运行良好,直到我开始接收erorrs,如

A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) 

如果我没有杀死它返回的过程

Exclusive access could not be obtained because the database is in use.

所以我的问题是,重建或保持稳定连接的最佳流程是什么?我不会将所有内容更改为SMO或SQLConnection,或者是否有办法使用Invoke-Sqlcmd建立单个连接,但每次我杀死/重新排队使用调用.

有问题的脚本首先备份我的数据库,使用try / catch中的补丁脚本运行和更新,如果脚本将在catch中备份错误,除了kill进程之外全部使用Invoke-Sqlcmd.

最佳答案 这三个都有它们的用途.

我喜欢invoke-sqlcmd for quick&脏查询或其他文件中已存在的查询(因为您可以传入文件参数).不过,我从来没有处理过引发这个问题的错误.

我使用SQLConnection& SQLCommand当我需要更多的安全参数化查询时,或者想要保持更持久的连接 – 当我快速连续运行大量查询时 – 这样我就不会在服务器上添加大量连接很短的时间.

SMO我还没有真正使用过,但我会保留用于管理“系统”级别 – 工作,备份等等.你可以用SMO做任何事情 – Wayne Sheffield有添加& amp;改变表格和上个月在his blog存储过程(我无法链接到帖子,因为我的办公室防火墙阻止它的原因不明).我通常会通过T-SQL查询来做到这一点,但它可以两种方式工作,我相信使用SMO必须有一些优势.

点赞