Lew*_*wis 4 powershell smo sqlconnection sqlcmd
我一直在创建一些 power shell 脚本,并且我主要使用 Invoke-Sqlcmd 作为查询数据库或输入 .sql 文件的一种方式,但是我在包含访问和终止进程方面遇到了一些麻烦。
我一直在使用 SMO 来终止进程
$SQlSvr1 = New-Object Microsoft.SqlServer.Management.Smo.Server $serverInstance
$SQlSvr1.KillAllprocesses($databaseMain)
Run Code Online (Sandbox Code Playgroud)
然后使用 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.)
Run Code Online (Sandbox Code Playgroud)
如果我没有终止进程,它会返回
无法获得独占访问权限,因为数据库正在使用中。
所以我的问题是,重新生成或保持稳定连接的最佳过程是什么?我不会将所有内容更改为 SMO 或 SQLConnection,或者是否有办法使用 Invoke-Sqlcmd 建立单个连接,但每次我都会杀死/重新排队使用调用。
有问题的脚本首先备份我的数据库,使用 try/catch 中的补丁脚本运行和更新,如果有错误,脚本将在 catch 中备份,所有使用 Invoke-Sqlcmd 除了终止进程。
三者各有千秋。
我喜欢invoke-sqlcmd
快速和脏查询,或其他文件中已经存在的查询(因为您可以传入文件参数)。不过,我从来没有处理过引发问题的错误。
我用SQLConnection
与SQLCommand
当我需要更多的安全-参数化查询,例如-或想保持更持久连接-当我跑了很多快速连续查询-所以,我不好多锤服务器短时间内的连接。
SMO 我还没有真正使用过,但我会保留它用于在“系统”级别进行管理 - 作业、备份等。您几乎可以使用 SMO 做任何事情 - Wayne Sheffield 有添加和更改表和存储过程的示例他上个月的博客(我无法链接到这些帖子,因为我的办公室防火墙出于未知原因阻止了它)。我通常会通过 T-SQL 查询来做到这一点,但它是双向的,而且我确信使用 SMO 来做这件事一定有一些优势。