我最近不得不卸载 Visual Studio 2012 和 DTS,然后再次安装 VS 2017 和 DTS。之后,包含的目录sqlcmd.exe
不在我的PATH
变量中。我安装了以下。
vs_Professional-vs2017-15.9.41.exe
SSDT-Setup-ENU-vs2017-15.9.9.exe
应该安装这些套件中的任何一个sqlcmd.exe
吗?如果没有,哪个工具会安装它?我需要一个可以与 SQL Server 2012+ 一起使用的。
我最近不得不卸载 Visual Studio 2012 和 DTS,然后再次安装 VS 2017 和 DTS。之后,包含的目录sqlcmd.exe
不在我的PATH
变量中。我安装了以下。
vs_Professional-vs2017-15.9.41.exe
SSDT-Setup-ENU-vs2017-15.9.9.exe
应该安装这些套件中的任何一个sqlcmd.exe
吗?如果没有,哪个工具会安装它?我需要一个可以与 SQL Server 2012+ 一起使用的。
在 SQL Server Management Studio 中,可以在SQLCMD 模式下运行批处理命令,使用!! 命令。但是,在 Azure Data Studio 中,这似乎不起作用(SQLCMD 自2019 年 11 月版本 1.13.0起在 ADS 中可用),我以 Windows 管理员身份运行 ADS。
如何使用 SQLCMD 模式在 Azure Data Studio 中执行批处理命令? 我错过了什么,还是我需要阅读一些(稀缺)文档?
- 在 SQL Server 管理工作室中:
- 在 Azure 数据工作室
我正在开发将静默部署 SQL 服务器实例的工具,我需要在安装后运行一些脚本,但我很难找到 SQLCMD 实用程序的位置。
例如,我使用这个:
FEATURES=SQLENGINE,SDK
但是安装完成后系统上没有SQLCMD。
它在哪里?
更新:
我设法创建了一个静默安装,其中包括 sqlcmd 工具:
FEATURES=SQLENGINE,工具
我查看了如何确定已安装的 SQL Server 实例及其版本?已经但是 CMD 什么都不返回:
C:\Windows\system32>sqlcmd -L
C:\Windows\system32>
但是在使用 Visual Studio (v2019) 时,我转到查看 > SQL Server 对象资源管理器,我看到两个带有系统数据库的 SQL Server 实例。一个称为 (LocalDB)\MSSQLLocalDB,另一个称为 (LocalDB)\ProjectsV13。
两者都使用 SQL Server 2016 (v13.0.4001)。使用它我也能够通过 SSMS 2018 进行连接。
我的问题是:为什么这些实例没有出现在命令行中?我可以删除其中一个服务器实例吗?为什么有两个?
我努力了:
我检查了我的服务,我只有 SQL Server VSS 写入。其他一切都与 SQL 无关。我在 SQL Server 配置管理器中查找,但那里的 SQL Server 服务也是空的。我检查了 C:\Program Files (x86)\Microsoft SQL Server\90\Shared 并且 sqlbrowser.exe 也不存在。
我刚刚尝试在 TCP 1433 和 UDP 1434 上设置入站和出站规则以允许连接。再次失败,cmd 没有返回任何内容。
我打开防火墙日志并在运行命令几次后检查了日志,但没有记录任何内容(成功或失败)。我打开了 powershell 并对我的 ip 和端口 1433 和 1434 进行了测试网络连接,但是 ping 失败了。仍然没有写入防火墙日志文件。
我的脚本包含多个GO
关键字。我知道 SQLCMD 解释GO
为批处理分隔符,因此代码不是作为单个块运行,而是分隔符(批处理)之间的每个部分单独运行。我的问题是,所有批次都在同一个会话中执行吗?
我尝试使用这样的简单脚本对此进行测试:
SELECT @@SPID
GO
SELECT @@SPID
GO
SELECT @@SPID
GO
然后我使用这个命令从命令行运行脚本
SQLCMD -S MyServer\Instance -E -i MyScript.sql
并得到这个输出:
------
62
(1 rows affected)
------
62
(1 rows affected)
------
62
(1 rows affected)
它似乎肯定地回答了我的问题,但随后我再次运行脚本并得到完全相同的输出,即所有值都62
再次出现。显然 SQLCMD 的两个单独执行不可能在同一个会话中运行,它们只是碰巧收到了相同的会话 ID。但这反过来又让我认为@@SPID
单次运行返回相同的值可能并不一定意味着它是同一个会话。每个批次都可以在恰好接收到相同 ID 的不同会话中执行,类似于 SQLCMD 的不同执行在具有相同 ID 的不同会话中运行的方式。
因此,我的问题仍然存在:是否在同一会话中在 SQLCMD 中执行了多批相同的脚本?有没有办法确定这一点?
如何从 PowerShell Invoke-Sqlcmd 本地记录输出?
我正在使用 Invoke-Sqlcmd 循环遍历一组大型(50,000-90,000 个 SQL 文件,每个文件中有 1-10 个插入)小 SQL 插入语句集。大多数插入语句运行正确,但一些字符串太长,我得到“字符串或二进制数据将被截断”错误。
现在我正在使用 Start-Transcript 来捕获输出并识别有问题的插入语句,但 Start-Transcript 会捕获所有内容。我只想捕捉错误 - 或者 - 只捕捉 Invoke_Sqlcmd 语句输出。
如果这行得通(我相信它应该),我会准备好的:
Invoke-Sqlcmd -InputFile $sql -ServerInstance LocalHost -Database Test_DB -Credential $pwd -Verbose -OutputSqlErrors $true | Out-File -FilePath "C:\Temp\Errorlog.txt" -Append
或者,如果这有效:
Invoke-Sqlcmd -InputFile $sql -ServerInstance LocalHost -Database Test_DB -Credential $pwd -Verbose -OutputSqlErrors $true | Tee-Object -FilePath "C:\Temp\Errorlog.txt" -Append
但这些都不起作用。
我也尝试过这个怪物,但我根本没有得到任何错误:
$sqls = (Get-ChildItem -Path "I:\2019_06_24\_SQL"-Filter *.sql | Sort-Object -Property CreationTime).FullName
foreach ($sql in $sqls)
{
$Error.Clear()
try
{
Invoke-Sqlcmd -InputFile $sql -ServerInstance LocalHost -Database Test_DB -Credential $pwd -Verbose -OutputSqlErrors $true
}
catch
{
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' | Out-File "C:\Temp\Errorlog.txt" -Append
$sql | out-file -filepath "C:\Temp\Errorlog.txt" -Append
$Error | out-file -filepath "C:\Temp\Errorlog.txt" -Append
}
}
如何直接从 Invoke-Sqlcmd 语句记录?
在脚本中我有指令
:connect DbServer
似乎如果我在 SQLCMD 中运行这个脚本(像这样:
sqlcmd -i script.sql
然后 sqlcmd 尝试使用命名管道进行连接(这不起作用)。我收到错误消息,指出命名管道提供程序无法连接。但是,如果我尝试通过在 -S 参数中指定其名称来连接到同一台服务器,它就可以正常工作。
有没有办法让 :connect 指令知道我正在尝试通过 TCP/IP 进行连接?
我尝试使用 :connect tcp:DbServer 无济于事。也尝试通过 IP 地址,结果相同。在这台机器上,我没有 SQL Server 配置管理器来指定 connectino 别名或操作协议。也许这是下一步要做的事情,但我想知道是否有人知道在脚本中包含连接规范的方法。
当我从 cmd 运行以下 perl 脚本时收到上述错误消息,该脚本应该在我的数据库中执行一些事务。
#!/usr/bin/perl.
use warnings;
use strict;
my ( $pid1, $pid2, $pid3, $i ); #Declaration of local variables
$| = 1;
if ( ($pid1 = fork()) && ($pid2 = fork()) && ($pid3 = fork()) ) { #Starts child processes
print( "I have to wait for my kids.\n" ); #The main process execute this code
my $straggler = wait(); #The main process waits for all the children to finish
print( "Finally $straggler finished, now I can go.\n" );
}
elsif ( $pid1 && $pid2 && defined($pid3)) { #Is executed by the third child
sleep( 1 ); #Wait 1 second
print( "Start moving money between account 1 - 2" );
sleep(2);
for ($i=0; $i < 1000; $i++) { #Start transaction repeatedly
system("sqlcmd -S DESKTOP-U368A1B -Q tranKonto(1,2,100,1)"); #Moves 100 from account 1 to account 2
}
print( "End moving money between accounts trans 1 - 2 " );
exit();
}
else {
die( "Forking problems: " );
}
交易看起来像这样:
PROCEDURE [dbo].[tranKonto] @konto1 INT, @konto2 INT, @belopp INT, @isoLevel INT
AS
BEGIN TRANSACTION tranKonto
IF(@isoLevel=0)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
ELSE IF (@isoLevel = 1)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
ELSE IF (@isoLevel=2)
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
ELSE IF(@isoLevel=3)
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN
UPDATE Konto SET belopp=belopp-@belopp WHERE kontonr=@konto1
UPDATE Konto SET belopp=belopp+@belopp WHERE kontonr=@konto2
EXEC kontoLog_SP @konto1, @konto2 , @belopp , @isoLevel;
END
COMMIT TRANSACTION tranKonto
RETURN
运行脚本时出现以下错误消息:
消息 102,级别 15,状态 1,服务器 DESKTOP-U368A1B,第 1 行“1”附近的语法不正确。
如果有人能帮助我,我将不胜感激。我试图用谷歌搜索解决方案,但没有任何运气。