4

我一直在创建一些强大的 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.) 

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

无法获得独占访问权限,因为数据库正在使用中。

所以我的问题是,什么是重新生成或保持稳定连接的最佳过程?使用调用。

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

4

1 回答 1

5

三者各有所用。

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

当我需要更多安全性时(例如,参数化查询)或想要保持更持久的连接时(当我快速连续运行大量查询时)我使用SQLConnection& ,这样我就不会用很多SQLCommand短时间内连接。

SMO 我还没有真正使用过,但我会保留它用于在“系统”级别进行管理 - 作业、备份等。你可以用 SMO 做几乎任何事情 - Wayne Sheffield 有添加和更改表和存储过程的示例他上个月的博客(我无法链接到帖子,因为我的办公室防火墙出于未知原因阻止了它)。我通常会通过 T-SQL 查询来做到这一点,但它可以双向工作,而且我确信用 SMO 做这件事一定有一些优势。

于 2013-03-05T16:14:37.220 回答