我正在从一个批处理文件运行 sqlcmd,我想知道如何让它在备份出现问题时返回 0 以外的 ERRORLEVEL。
我正在尝试运行sqlcmd.exe以便从命令行设置新数据库。我在 Windows 7 64 位上使用 SQL SERVER Express 2012。
这是我使用的命令:
SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log
Run Code Online (Sandbox Code Playgroud)
这是一段 sql 文件创建脚本:
CREATE DATABASE aqualogy
COLLATE Modern_Spanish_CI_AS
WITH TRUSTWORTHY ON, DB_CHAINING ON;
GO
use aqualogy
GO
CREATE TABLE [dbo].[BaseLayers] (
[Code] nchar(100) NOT NULL ,
[Geometry] nvarchar(MAX) NOT NULL ,
[IsActive] bit NOT NULL DEFAULT ((1))
)
EXEC sp_updateextendedproperty @name = N'MS_Description', @value = N'Capas de cartografía base de la aplicaicón. Consideramos en Galia Móvil la cartografía(...)' …Run Code Online (Sandbox Code Playgroud) 是否有类似指令可以在脚本中使用以强制 SSMS 启用/禁用 SQLCMD 模式?
我必须重构并记录一些foo.sql查询,这些查询将由一个数据库技术支持团队共享(用于客户配置等)。有些类型的票会定期出现,每个客户都有自己的服务器和数据库,但除此之外,架构是完全相同的。
存储过程目前不是一个选项。我正在争论是使用动态还是 SQLCMD,我没有使用过太多,因为我对 SQL Server 有点陌生。
SQLCMD 脚本我觉得对我来说绝对“看起来”更干净,更容易阅读并根据需要对查询进行小的更改,但也会强制用户启用 SQLCMD 模式。由于使用字符串操作编写查询而导致语法突出显示丢失,因此动态更加困难。
这些正在使用 Management Studio 2012,SQL 版本 2008R2 进行编辑和运行。这两种方法的优缺点是什么,或者一种方法或另一种方法的一些 SQL Server“最佳实践”是什么?其中一个比另一个“更安全”吗?
declare @ServerName varchar(50) = 'REDACTED';
declare @DatabaseName varchar(50) = 'REDACTED';
declare @OrderIdsSeparatedByCommas varchar(max) = '597336, 595764, 594594';
declare @sql_OrderCheckQuery varchar(max) = ('
use {@DatabaseName};
select
-- stuff
from
{@ServerName}.{@DatabaseName}.[dbo].[client_orders]
as "Order"
inner join {@ServerName}.{@DatabaseName}.[dbo].[vendor_client_orders]
as "VendOrder" on "Order".o_id = "VendOrder".vco_oid
where "VendOrder".vco_oid in ({@OrderIdsSeparatedByCommas});
');
set @sql_OrderCheckQuery = replace( @sql_OrderCheckQuery, '{@ServerName}', quotename(@ServerName) );
set @sql_OrderCheckQuery = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 SQLCMD 实用程序通过 PowerShell 访问我计算机上的“localdb\MSSQLLocalDB”服务器。我使用的是 PowerShell v5、.NET v5.0,服务器名称是(localdb)\MSSQLLocalDB我在 Microsoft SQL Server Management Studio 2014 中连接到它时的名称。
PS C:\> sqlcmd -S localdb\MSSQLLocalDB并PS C:\> sqlcmd -S .\localdb\MSSQLLocalDB导致此错误:
Sqlcmd:错误:Microsoft ODBC Driver 11 for SQL Server:SQL Server 网络接口:定位服务器/实例时出错 [xFFFFFFFF]。
我在 Management Studio 中查询服务器名称SELECT @@ServerName并-S在上面的命令之后使用它并得到相同的错误。
PS C:\> sqlcmd -S localdb 给出这个错误:
Sqlcmd:错误:用于 SQL Server 的 Microsoft ODBC 驱动程序 11:命名管道提供程序:无法打开与 SQL Server 的连接 [53]
其他注意事项:我能够连接到服务器并使用此连接字符串在 C# 控制台应用程序中使用名为testdb01的数据库System.Data.SqlClient:
"Data Source=(localdb)\\mssqllocaldb;Initial Catalog=testdb01;Integrated Security=SSPI;"
Run Code Online (Sandbox Code Playgroud) 使用 SQL Server 2008 R2 企业版
考虑以下语句:
:setvar source_server_name "SERVERNAME\INSTANCENAME"
Run Code Online (Sandbox Code Playgroud)
是否可以在 SQLCMD 模式下使用 TSQL 获取该值
就像是: :setvar source_server_name = SELECT @@servername
谢谢
2013 年 7 月 15 日更新
下面提供的两个答案并没有给出理想的结果,所以我添加了一个更相关的例子。
:setvar source_server_name [myserver]
Run Code Online (Sandbox Code Playgroud)
变量 source_server_name 设置为文本字符串 [myserver_1]
我希望能够做到这一点:
create table #tmp(
id int identity(1,1),
server sysname
)
insert into #tmp values('myserver_1'),('myserver_2');
:setvar source_server_name = SELECT server FROM #tmp WHERE id = 1
select '$(source_server_name)'
(No column name)
myserver_1
Run Code Online (Sandbox Code Playgroud)
变量 source_server_name 将设置为 ID 1 的服务器中的值。
我已经在 Ubuntu 16.04 机器上为 SQL Server 设置了 Microsoft ODBC Driver 13。我现在正在尝试测试一个数据库连接,其中包括服务器名称和实例名称。
以下都可以在 Windows 机器上正常工作:
sqlcmd -S "SERVERNAME\INSTANCENAME" -U User -P pwd -d DatabaseName -Q "SELECT TOP 5 Id FROM dbo.MyTable;"
sqlcmd -S SERVERNAME\INSTANCENAME -U User -P pwd -d DatabaseName -Q "SELECT TOP 5 Id FROM dbo.MyTable;"
Run Code Online (Sandbox Code Playgroud)
但是,它们都不适用于 Linux - 它们都返回下面的错误消息。该错误意味着找不到服务器:
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Login timeout expired.
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : MAX_PROVS: Error Locating Server/Instance Specified [xFFFFFFFF]. . …Run Code Online (Sandbox Code Playgroud) SQLServer 2005 引入了称为SQLCMD 模式 msdn 链接的东西 。
乍一看,这种模式从命令行批处理文件中添加了变量替换,还有一些转义到操作系统命令。
此功能是否在您的环境、生产或测试中使用?
如果我在同一个文件夹中有 foo.sql 和 bar.sql,则 foo.sql 在 sqlcmd 模式下从 SSDT 运行时可以引用 bar.sql :r ".\bar.sql"。但是,SSMS 不会找到它。Procmon 显示 SSMS 正在寻找%systemroot%\syswow64:

如何告诉 SSMS 在不显式声明路径的情况下查看当前脚本保存到的文件夹?
这是我目前在执行查询时得到的sqlcmd:
1> SELECT 1,2,3,4
2> GO
----------- ----------- ----------- -----------
1 2 3 4
(1 rows affected)
Run Code Online (Sandbox Code Playgroud)
虽然在更长的结果的情况下,这种输出格式不是人类可读的,因为它被包装在终端中。
如何垂直显示结果(相当于\Ginmysql)?或者以另一种人类可读的方式?
sqlcmd ×10
sql-server ×9
ssms ×2
dynamic-sql ×1
encoding ×1
linux ×1
powershell ×1
scripting ×1
ssdt ×1
ubuntu ×1