哪个更好使用Invoke-SQLCMD,SMO或SQLConnection

时间:2013-03-05 10:01:35

标签: powershell smo sqlconnection sqlcmd

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

我一直在使用SMO杀死进程

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

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

之类的错误
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.) 

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

  

由于数据库正在使用,无法获得独占访问权。

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

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

1 个答案:

答案 0 :(得分:4)

这三种都有它们的用途。

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

我使用SQLConnection& SQLCommand当我需要更多安全参数化查询时,或者想要保持更持久的连接时 - 当我快速连续运行大量查询时 - 这样我就不会对服务器进行锤击在很短的时间内有很多联系。

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