gpt4 book ai didi

sql-server - Invoke-Sqlcmd 运行脚本两次

转载 作者:行者123 更新时间:2023-12-02 20:16:58 31 4
gpt4 key购买 nike

我遇到了一个非常奇怪的问题,可以重复。

基本上,我使用invoke-sqlcmd通过使用-inputfile调用脚本文件,但是如果脚本文件有一些执行错误(例如插入到列不应为空的表中),则将执行脚本文件两次。我也可以从探查器中看到这两个执行。

这里是重现问题的方法(我的环境:Win 8.1 + SQL2014 + PS 5.0)

  1. 在数据库中创建两个表

    Use TestDB

    create table dbo.s (id int identity primary key, b varchar(50));

    create table dbo.t (id int primary key, s_id int, b varchar(50));
    alter table dbo.t add constraint fk_t foreign key (s_id) references dbo.s(id)
  2. 现在创建一个包含以下两行的 sql 文件(我们称之为 c:\temp\t.sql)

    insert into dbo.s ( b) select  'hello world'
    insert into dbo.t (s_id, b) -- purposely missing id to cause an error
    select 1, 'good morning'
  3. 运行以下 PS cmdlet

    invoke-sqlcmd -Server "<my_local_server>" -database TestDB -inputfile "c:\temp\t.sql"

现在,如果您打开 SSMS 查询窗口并执行以下操作,您的 PS 将返回错误

select * from TestDB.dbo.s

您将在那里看到两条记录,而不是一条。 Two records另一方面,如果我运行 sqlcmd.exe,则不存在此类问题,即 dbo.s 中只有一条记录。我错过了 SQLPS 中的某些配置吗?

最佳答案

我看到您在 MSDN 数据库引擎论坛上问了同样的问题:https://social.msdn.microsoft.com/Forums/en-US/d4167226-2da7-49ec-a5c2-60e964785c2c/powershell-invokesqlcmd-calls-stored-procedure-second-time-after-query-timeout-is-expired 。下面是该线程的 SMO 解决方法。

$SqlServerName = "YourServer";
$DatabaseName = "YourDatabase";
$ScriptFileName = "C:\Scripts\YourSqlScriptFile.sql";

Add-Type -Path "C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Smo.dll";

$sr = New-Object System.IO.StreamReader($ScriptFileName);
$script = $sr.ReadToEnd();
$sr.Close();

$Server = New-Object Microsoft.SqlServer.Management.Smo.Server($SqlServerName);
$db = $Server.Databases[$DatabaseName];
$db.ExecuteNonQuery($script);

关于sql-server - Invoke-Sqlcmd 运行脚本两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33271446/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com