如何使用sqlcmd列出给定sql server 08实例的所有数据库?
我在C#中创建一个进程来执行sqlcmd /S <servername> /d <dbname> /E /i以运行创建表,视图和存储过程的sql脚本.
问题是进程在执行完成后没有终止.我想知道如何在操作完成后立即终止sqlcmd.
sqlcmd是否有任何输入参数可以指定立即终止进程,还是可以直接在C#中进行?
更新
这是我用来执行进程的C#代码.
foreach (var file in files)
{
////var begin = DateTime.Now;
////context.TrackBuildWarning(string.Format("Start exec sql file at {0}.", DateTime.Now));
Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = "sqlcmd.exe";
process.StartInfo.Arguments = string.Format("-S {0} -d {1} -i \"{2}\" -U {3} -P {4}", sqlServerName, databaseName, file, sqlUserName, sqlPassword);
process.StartInfo.WorkingDirectory = @"C:\";
process.Start();
process.WaitForExit(); // if I comment out this code it …Run Code Online (Sandbox Code Playgroud) 我在powershell中有一个字符串,其中包含一个本机sqlcmd命令.命令本身可以在cmd.exe中成功执行.我很难在powershell中执行它们.有人可以帮忙吗?谢谢.
这是sql.sql
select @@servername
go
select @@servicename
Run Code Online (Sandbox Code Playgroud)
这是从cmd.exe执行sqlcmd命令时的结果
C:\Users\test>sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
--------------------------------------------------
thesimpsons\INSTANCE1
(1 rows affected)
--------------------------------------------------
INSTANCE1
(1 rows affected)
C:\Users\test>
Run Code Online (Sandbox Code Playgroud)
这是用于调用sqlcmd命令的powershell脚本.
$sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
"@
Invoke-Command $sql
Run Code Online (Sandbox Code Playgroud)
当我执行此powershell脚本时,我收到以下错误.
PS C:\TEMP> $sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
"@
Invoke-Command $sql
Invoke-Command : Parameter set cannot be resolved using the specified named parame
ters.
At line:5 char:15
+ Invoke-Command …Run Code Online (Sandbox Code Playgroud) 运行SQLCMD.exe并为脚本变量提供命令行参数时,我希望命令行上提供的值将覆盖SQL脚本文件中定义的值.
例如
给出以下SQL脚本:
:setvar XXX "SQL script"
print '$(XXX)'
Run Code Online (Sandbox Code Playgroud)
和命令行:
sqlcmd.exe -S <Server> -d <Database> -E -b -i <Script> -v XXX="Batch script"
Run Code Online (Sandbox Code Playgroud)
我希望输出为:
批处理脚本
但输出是:
SQL脚本
这是意图,还是必须:setvar删除SQL脚本中的语句?
我:setvar在脚本中提供了语句,因此我可以使用SQLCMD模式在SQL Management Studio中编辑/测试脚本,但是在我的测试和生产环境中从命令行运行脚本.
我有这个命令
sqlcmd.exe -E -i "C:\joe-db-scripts\joe-db-tasks.Install.sql"
Run Code Online (Sandbox Code Playgroud)
我需要添加32001的特定非标准端口.我该怎么办?我在考虑一些标志-p或类似的东西,但我不知道语法.
我有一个批处理文件,使用sqlcmd运行一些SELECT查询,将结果放入文本文件,并将这些文件上传到FTP服务器.这一切都按照它应该的方式工作,这就是我喜欢的工作方式.
不过,我一直想知道在发生错误时我会怎么做.假设某人更改了我正在点击的数据库的数据结构,但没有通知我.如果我运行sqlcmd SELECT语句并将结果放入文本文件中,我最终会得到一个包含错误的文本文件,然后直接进入FTP就好像没有错.(我已经测试了这个.)
我希望能够检查来自sqlcmd的错误 - 超时,错误的凭据,格式错误的查询等等,我只是不确定这是怎么做的或者"最佳实践"是什么.我总是可以尝试抓取输出文本文件并搜索我认为可能发生的错误,但由于各种原因这是有问题的.
任何人都有这方面的经验,他们想分享?
我目前正在学习SQL Server,并且在使用连接到本地数据库时遇到问题sqlcmd.
当我在Powershell中键入以下内容时:
sqlcmd -S "(localdb)\mssqllocaldb"
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
Sqlcmd:错误:用于SQL Server的Microsoft ODBC驱动程序13:SQL Server网络接口:系统找不到指定的文件.
Sqlcmd:错误:SQL Server的Microsoft ODBC驱动程序13:登录超时已过期.
Sqlcmd:错误:SQL Server的Microsoft ODBC驱动程序13:建立与SQL Server的连接时发生了与网络相关或特定于实例的错误.找不到服务器或无法访问服务器.检查实例名称是否正确以及SQL Server是否配置为允许远程连接.有关详细信息,请参阅SQL Server联机丛书.
如果我使用SQL Server Management Studio,我可以连接到本地数据库.如果我使用实例名称管道,我也可以连接到本地数据库.
我有一个干净安装的Windows 10 x64,Visual Studio社区和SQL Server Management Studio 2016.
我正在尝试使用MSSQL DB创建自己的Docker镜像以进行开发.它基于microsoft/mssql-server-linux图像.在构建期间,我想将一些.sql文件复制到容器中,然后运行这些脚本(创建数据库模式,表,插入一些数据等).我Dockerfile看起来像这样:
# use MSSQL 2017 image on Ubuntu 16.04
FROM microsoft/mssql-server-linux:2017-latest
# create directory within SQL container for database files
RUN mkdir -p /opt/mssql-scripts
# copy the database files from host to container
COPY sql/000_create_db.sql /opt/mssql-scripts
# set environment variables
ENV MSSQL_SA_PASSWORD=P@ssw0rd
ENV ACCEPT_EULA=Y
# run initial scripts
RUN /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'P@ssw0rd' -i /opt/mssql-scripts/000_create_db.sql
Run Code Online (Sandbox Code Playgroud)
000_create_db.sql在我看来,内容并不重要.
真正的问题是当我尝试Dockerfile使用命令构建它时,docker build -t demo .我总是会遇到这些错误:
Sqlcmd: Error: Microsoft ODBC …Run Code Online (Sandbox Code Playgroud) 我有下面的主脚本,它创建表,并插入一些数据,然后创建存储过程.
--todo_master.sql
use master
go
:r todo_create_ddl.sql
:r todo_create_dml.sql
:r todo_create_sprocs.sql
go
Run Code Online (Sandbox Code Playgroud)
但是,即使todo_master.sql与其他三个脚本位于相同的路径中,也无法找到这三个脚本.
我收到以下错误:
A fatal scripting error occurred.
The file specified for :r command was not found.
Run Code Online (Sandbox Code Playgroud)
如果我提供如下所示的完整路径,则会按预期找到并执行这些文件.
"C:\Docs and Settings\user\My Docs\SSMS\Projects\todo_create_ddl.sql"
我可能会失踪什么?
编辑 正如杰森所建议我试过这个,但仍然得到同样的错误:
use master
go
:setvar path "C:\Documents and Settings\user\My Documents\SQL Server Management Studio\Projects"
:setvar ddl "todo_create_ddl.sql"
:setvar dml "todo_create_dml.sql"
:setvar sprocs "todo_create_sprocs.sql"
:r $(path)$(ddl)
:r $(path)$(dml)
:r $(path)$(sprocs)
go
Run Code Online (Sandbox Code Playgroud) 我在DOS批处理文件中运行时试图获取SQL语句的值...
sqlcmd -E -S DEVSERVER -Q "SELECT COUNT(1) as [CaseCount] FROM Cases"
Run Code Online (Sandbox Code Playgroud)
我不是在这个stackoverflow问题之后的错误级别之后,而是在我从数据库返回的实际计数之后,所以我可以做一些额外的逻辑.
sqlcmd ×10
sql-server ×6
batch-file ×3
powershell ×2
c# ×1
database ×1
docker ×1
dockerfile ×1
dos ×1
smss ×1
sql ×1
ssms ×1
windows ×1