作为数据库修订控制(和自动安装)过程的一部分,我们需要能够在 ASP 页面内对各种 .sql 文件运行 sqlcmd.exe。我用来执行此操作的代码是:
Dim cmd : cmd = "sqlcmd -S " & DATABASE_SERVER & " -U " & DATABASE_UID & " -P " & DATABASE_PWD & " -d " & DATABASE_NAME & " -i """ & scriptPath & """ -b"
Dim wshShell : Set wshShell = Server.CreateObject("WScript.Shell")
Dim return : return = wshShell.Run(cmd, 0, True)
Run Code Online (Sandbox Code Playgroud)
我的代码可以在我的开发机器(运行 XP)上运行,但现在我已将其部署到 Windows 2003 服务器上,但它遇到了问题。问题是返回值始终为 1。如果我尝试让它运行批处理文件或我能想到的其他任何文件,也会发生这种情况(如果我将 cmd 的值更改为不存在的文件,它会崩溃)正如我所期望的那样)
我尝试添加 I_USR 和 I_WAM 以对 sqlcmd.exe 和 cmd.exe 都具有执行权限,但它仍然返回 1。如果我在服务器上打开命令提示符并执行“runas /user:servername\i_usr sqlcmd.exe " 工作正常,但从 …
我们有时会编写重命名表或列并具有其他复杂逻辑的数据端口脚本。我们还在 IF 语句中使用 SQL 来引用那些旧的列或表。我们有一个标准使用 IF 语句来使我们的 SQL 脚本多运行友好。
但是偶尔,即使 if 语句的计算结果为 false,包裹在块中的代码也会出错,我猜是因为语法检查。
if 1 = 0
begin
select * from mydatabase.dbo.mytable; -- doesn't execute, but still errors because doesn't exist
end
Run Code Online (Sandbox Code Playgroud)
另一个奇怪的事情是它并不总是一致的,有时它工作正常。
有谁知道我是否可以通过脚本禁用这些类型的检查。
谢谢
笔记
我知道人们会说他们尝试过类似的情况并且没有出错。起初对我来说,它在 SSMS 中没有出错,但在 SQLCMD 中出错了。
sqlcmd MyTestScript.sql -r 1 -U user -P password
Run Code Online (Sandbox Code Playgroud)
然后我将 SSMS 置于 SQLCMD 模式 Query -> CMDMODE 并且它仍然没有给出错误。然后在重新运行几次后,它开始在两者中出错。
案件
目前我正在研究数据库种子脚本,用sqlcmd.执行.例如这个脚本示例:
IF (SELECT COUNT(*) FROM Genders)=0
BEGIN
PRINT N'Seeding table Genders...'
SET IDENTITY_INSERT Genders ON
GO
INSERT INTO Genders (GenderId, Description) VALUES (0, 'Onbekend');
INSERT INTO Genders (GenderId, Description) VALUES (1, 'Vrouw');
INSERT INTO Genders (GenderId, Description) VALUES (2, 'Man');
INSERT INTO Genders (GenderId, Description) VALUES (3, 'Onzijdig');
INSERT INTO Genders (GenderId, Description) VALUES (4, 'Vrouwman');
INSERT INTO Genders (GenderId, Description) VALUES (5, 'Manvrouw');
SET IDENTITY_INSERT Genders OFF
END
GO
Run Code Online (Sandbox Code Playgroud)
问题
但是,如果我sqlcmd在SQL Server Management Studio中使用模式执行它,它会给我这个错误: …
这里我动态地在数据库中创建表.用户输入姓名作为他的愿望并选择语言radiobutton.所以问题是在执行cmd.ExecuteNonQuery之后,i整数从0开始变为-1.并且表明该表无法创建但是当我去数据库时它已经成功创建了.请让我知道我在哪里做错了.Thanx提前!!
protected void btnpaper_Click(object sender, EventArgs e)
{
try
{
string conn = ConfigurationManager.ConnectionStrings["sqlconn"].ConnectionString;
SqlConnection con = new SqlConnection(conn);
con.Open();
char[] arr = new char[] {'n','g','l','i','s','h'};
string str = "CREATE TABLE " + Label1.Text.Trim() +
txtpaperset.Text.Trim()+ rbtnEng.Text.TrimEnd(arr) +
"(" + "quesNo int NOT NULL PRIMARY KEY, " +
"question varchar(1000) NOT NULL," +
"ansA varchar(500) NOT NULL, " +
"ansB varchar(500) NOT NULL, " +
"ansC varchar(500) NOT NULL, " +
"ansD varchar(500) NOT NULL, " +
"rightAns varchar(50) NOT …Run Code Online (Sandbox Code Playgroud) 我有一个新安装的SQL Server 2008 R2 Express.我试图运行SQLCMD在本地(请注意局部),但我收到的错误:
命名管道提供程序:无法打开与SQL Server的连接[2]
Sqlcmd:错误:Microsoft SQL Serve Native Client 10.0:建立与SQL Server的连接时发生了与网络相关或特定于实例的错误.找不到服务器或无法访问服务器.检查实例名称是否正确以及SQL Server是否配置为允许远程连接.有关更多信息,请参阅SQL Server联机丛书..
Sqlcmd:错误:Microsoft SQL Server Native Client 10.0:登录超时已过期.
为什么我不能让它运作?我已经尝试了一切.
我想从SQL Server查询输出中删除列标题.我做了搜索,但没有找到任何解决方案.我有一个查询,例如.
select cc.DepartmentID , cc.Name from HumanResources.Department cc
Run Code Online (Sandbox Code Playgroud)
当我运行此查询时,我得到这样的输出.
ID Name
12 Document Control
1 Engineering
16 Executive
14 Facilities and Maintenance
10 Finance
9 Human Resources
Run Code Online (Sandbox Code Playgroud)
我想从SQL Server的输出中删除ID和名称(列标题).
我将通过脚本运行此查询以生成csv文件.
编辑:
当我通过脚本运行查询时,我将csv文件作为输出,它看起来像这样.
#TYPE System.Data.DataRow
ID Name
Run Code Online (Sandbox Code Playgroud)
更新:
我正在使用PowerShell脚本.
$Database = "temp"
$Server = "localhost"
$AttachmentPath = "output.csv"
# Connect to SQL and query data, extract data to SQL Adapter
$SqlQuery = "select cc.DepartmentID , cc.Name from HumanResources.Department cc"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Data Source=$Server;Initial Catalog=$Database;Integrated Security = …Run Code Online (Sandbox Code Playgroud) 这是我用来创建.rar带有密码的文件的代码
DECLARE @source VARCHAR(1000),
@destination VARCHAR(1000),
@Command VARCHAR(1000)
SET @source = 'E:\Temp\testRar.txt'
SET @destination = 'E:\Temp\testRar.rar'
SET @Command = '"C:\Program Files\WinRAR\Rar.exe" a -ep1 -pasd^ad ' +@destination+' '+@source
EXEC MASTER..xp_cmdshell @Command
Run Code Online (Sandbox Code Playgroud)
但是它设置asdad密码而不是密码asd^ad,^符号将被忽略。为什么?
我尝试通过以下命令使用 sqlcmd 进行访问:
sqlcmd -U sa -P $test$ -S 主机名 -d db_test -i .\prova.sql > 升级.log
但登录失败。
我正确的密码,我认为是特殊字符的问题,在本例中是 $。
你有什么解决办法吗?
谢谢F。
我正在将我们的部署基础结构移植到 Azure DevOps(以前称为 Visual Studio Team Services),但我遇到了一个找不到任何好的解决方案的问题。
我们正在使用 EF Core Migrations,为了解决一些不相关的问题,我们需要在 SQLCmd 中动态包装 SQL 脚本,这很容易使用 PowerShell。
但是,当将我们的脚本作为发布管道中的常规 PowerShell 步骤执行时,它会失败,因为 SQLCMD.exe 不可用。并不奇怪 - 但我也找不到任何记录的安装方式。
是否有工具安装程序或一些类似的现成组件可以让我执行 PowerShell 脚本,该脚本调用 SQLCMD.exe(通过Invoke-SqlCmd)作为 Azure Devops 管道的一部分?如果没有,无论如何,最简单的方法是什么?
我遵循了 Microsoft 官方文档,并安装了 SQL Server Docker 映像
结果,我在 IP 地址 172.17.0.2 的 Docker 上运行了一个 SQL Server 映像
我还可以使用带有我的虚拟密码的 sqlcmd 轻松连接到它
问题是我无法通过 SSMS 连接到它:
Login failed for user 'sa'. (Microsoft SQL Server, Error: 18456)
Run Code Online (Sandbox Code Playgroud)
当然,在发布此问题之前,我阅读了其他 StackOverflow帖子,并且尝试了多次登录:
如果 localhost 无法正常工作以及 docker 映像的 IP 地址,我该如何连接?
sqlcmd ×10
sql-server ×6
sql ×5
powershell ×2
t-sql ×2
asp-classic ×1
asp.net ×1
azure-devops ×1
c# ×1
containers ×1
docker ×1
ssms ×1
validation ×1
xp-cmdshell ×1