【问题标题】:Which is better to use Invoke-SQLCMD, SMO or SQLConnection使用 Invoke-SQLCMD、SMO 或 SQLConnection 哪个更好
【发布时间】:2013-03-05 10:01:35
【问题描述】:

我一直在创建一些强大的 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 进程。

【问题讨论】:

    标签: powershell smo sqlconnection sqlcmd


    【解决方案1】:

    三者各有所用。

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

    当我需要更多安全性时使用SQLConnectionSQLCommand - 例如,参数化查询 - 或者想要保持更持久的连接 - 当我快速连续运行大量查询时 - 这样我就不用不要在短时间内用大量连接锤击服务器。

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

    【讨论】:

    • 我工作的 90% 是基于补丁脚本文件,所以我认为只使用 invoke-sqlcmd 将是最好的?
    • 如果你只是需要在服务器上扔一堆预先写好的脚本文件,我肯定会从invoke-sqlcmd开始。您也可以使用 SMO 来完成,但就像我说的,我没有这方面的经验。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2017-11-25
    • 1970-01-01
    • 2019-09-21
    • 2011-04-09
    • 2021-01-21
    相关资源
    最近更新 更多