如果我没记错的话,上次Microsoft Sqlcmd要求每个命令都以';'结尾 然后按 Enter 键执行命令。
但是,目前,我们需要在GO每次执行命令时键入 。
那么,是否有其他替代方法,当我们在以“;”结束命令后按 Enter 键时,它会执行命令吗?
我正在尝试sp_AskBrent使用 PowerShell运行Invoke-SQLCmd并在变量中捕获其输出:
$query = "EXEC SAIDBA.monitoring.sp_AskBrent @Seconds=10;"
$check = Invoke-Sqlcmd -ServerInstance $ServerInstance -Query $query
-ErrorAction Stop -ConnectionTimeout 3
Run Code Online (Sandbox Code Playgroud)
使用ExpertMode = 0运行时,没问题。
但是当使用ExpertMode = 1运行时,我们注意到三件事:
$check 一片空白 它以以下错误结束:
Invoke-Sqlcmd:SQL PowerShell 中不允许出现重复的列名。要重复列,请使用 Column_Name AS New_Name 格式的重复列的列别名。
在行:1 字符:18
- $check = Invoke-Sqlcmd -ServerInstance $ServerInstance -Query $query -Er ...
- CategoryInfo: SyntaxError: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
- FullQualifiedErrorId : DuplicateColumnNameErrorMessage, Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
我认为有一种解决方法可以提供sp_AskBrent将ExpertMode数据存储到表中并随后从这些表中选择的参数,但我想确保无法在 PowerShell 中立即恢复所有内容。
SSMS 登录框的有效连接字符串是什么?
每隔一段时间,我将不得不连接到具有某些特定配置设置的 SQL Server 实例或在没有可用主机名的 DMZ 中,或者我将不得不通过 SSMS 或 SQLCMD 连接到专用管理连接 (DAC) . 因为我很少通过特定端口或使用 DAC 连接到 SQL Server,所以我往往会忘记启动和运行连接的确切语法选项。然后,我将不得不无数次再次搜索 Internet以检索确切的连接字符串,并且经常会因为找不到所需信息而感到沮丧。
我将阅读之前发布在 Serverfault、Stackoverflow 和 DBA 上的所有问题和答案。
[1] DAC 连接端口 SQL Server 2005 SP3
[2]远程 SQL 服务器连接失败
[3] SQL Server 2008 R2 远程连接
[5] DAC 连接错误
此外,我将在 Microsoft 站点上搜索相关文章:
[6]如何配置 SQL Server 侦听特定端口
[7]配置 Windows 防火墙以允许 SQL Server 访问
[8]外围配置
[9]如何配置 SQL Server 侦听不同 IP 地址上的不同端口?
[10] …
我正在使用 sqlcmd.exe 运行一个大型 SQL 脚本,并且服务器 CPU 使用率在过去 5 小时内一直处于 100%。SQL 脚本文件的大小为 156 MB。我在 SQL Server 2005 上运行脚本。这对我来说并不正常。
使用 SQL Server Management Studio 运行脚本不是一种选择,因为它不会运行非常大的文件。
注意:我知道 SQL 脚本很好,因为我可以使用另一个工具(xSQL 数据)在本地机器上运行它。不幸的是,我无法访问服务器上的该工具。
我注意到一些我不确定的事情。难道直接使用 SSMS 运行查询比使用 SQLCMD 运行查询快得多?我注意到使用 SSMS 运行的查询结果写入磁盘的速度要快得多。
有什么区别?
谢谢。
我正在编写一个可以在新服务器上运行的脚本以进行一些初始配置。我希望能够跳过某些部分,但我遇到的问题是所需的“GO”。由于 GO,我无法将我的代码段包装在 IF 语句中。例如
:setvar EnableDBMail 0
IF ($(EnableDBMail) = 1 )
BEGIN
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Database Mail XPs', 1;
GO
RECONFIGURE
GO
END
....etc
Run Code Online (Sandbox Code Playgroud)
问题是这行不通,因为您必须使用 GO。还有另一种方法吗?我试过搜索,但还没有找到任何东西。
我很困惑我应该如何使用 sqlcmd 的 -b 参数。我正在尝试为我的数据库编写简单的自动化脚本,并希望在出现任何错误时停止执行。我正在使用 SQLServer 2008r2。
为了测试,我调用了简单的脚本
sqlcmd -b -i test.sql
Run Code Online (Sandbox Code Playgroud)
test.sql 内容:
PRINT 'test1';
RAISERROR ('Error raised', 15, 15);
PRINT 'test2';
Run Code Online (Sandbox Code Playgroud)
我希望在第一次打印后我会看到错误消息并且脚本会停止。但是每次执行第二次打印时,我都会看到以下输出:
test1
消息 50000,级别 18,状态 15,服务器 TOMEK,第 3 行
错误引发
test2
我做错了什么?
我在整个企业的许多 SQL 代理作业步骤中都有这个,并且它按预期工作:
sqlcmd -E -S $(ESCAPE_SQUOTE(SRVR)) -d master -Q "EXECUTE MyStoredProc etc..."
Run Code Online (Sandbox Code Playgroud)
但是在我的新 SQL Server 2016 实例上,它只会产生一个命名管道连接错误(这是一个完全的红鲱鱼)。
另一方面,这在我的新服务器上运行良好:
sqlcmd -E -S MyExplicitServerName -d master -Q "EXECUTE MyStoredProc etc..."
Run Code Online (Sandbox Code Playgroud)
为什么 SRVR 令牌不起作用?
如果我在命令提示符下启动 sqlcmd 并告诉它打印$(ESCAPE_SQUOTE(SRVR))它说:
'SRVR' scripting vaiable not defined.
Run Code Online (Sandbox Code Playgroud)
这是一个非常基本的、简单的安装,只有默认实例。
考虑以下代码:
DECLARE @db sysname;
DECLARE @filename varchar(260);
DECLARE cur CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT d.name
FROM sys.databases d;
OPEN cur;
FETCH NEXT FROM cur INTO @db
WHILE @@FETCH_STATUS = 0
BEGIN
SET @filename = 'C:\temp\create_database_' + @db + '.txt';
:setvar c @filename
:out $(c)
PRINT $(c);
FETCH NEXT FROM cur INTO @db
END
CLOSE cur;
DEALLOCATE cur;
Run Code Online (Sandbox Code Playgroud)
我希望在 中创建多个文件C:\temp,每个数据库一个,但没有创建任何文件,并且 SQL Server 没有报告任何错误。
我试过使用 SQLCMD 模式在 SSMS 中运行它,我也试过从 sqlcmd.exe 运行它
如何本地记录来自 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
Run Code Online (Sandbox Code Playgroud)
或者,如果这有效:
Invoke-Sqlcmd -InputFile $sql -ServerInstance LocalHost -Database Test_DB -Credential $pwd -Verbose -OutputSqlErrors $true | Tee-Object -FilePath "C:\Temp\Errorlog.txt" -Append
Run Code Online (Sandbox Code Playgroud)
但这些都不起作用。
我也尝试过这种怪物,但我根本没有从中得到任何错误:
$sqls = (Get-ChildItem -Path "I:\2019_06_24\_SQL"-Filter *.sql | Sort-Object -Property CreationTime).FullName
foreach ($sql in $sqls)
{
$Error.Clear()
try …Run Code Online (Sandbox Code Playgroud)