如何通过PowerShell连接到本地SQL Server 2016并执行存储在.sql文件中的SQL?

问题描述 投票:0回答:1

我正在尝试创建一个PowerShell脚本来自动化一个非常简单的过程,但是,我无法工作(如果有的话)。文档不是我需要的,过时的或冲突的。

我有一些变化:

$SQLConnection = New-Object System.Data.SQLClient.SQLConnection 
$SQLConnection.ConnectionString = "Data Source=.\SQL2016;Initial Catalog=TEST;Trusted_Connection=true;" 
$SQLConnection.Open()

$Cmd = new-object system.Data.SqlClient.SqlCommand($SQLConnection)

Invoke-Sqlcmd -InputFile "C:\dev\test\script.sql" | Out-File -filePath "C:\dev\test\output.sql"

$SQLConnection.Close()

我没有设法连接到数据库。

想法是,script.sql吐出一堆SQL(这很好用),我们将把它放到源代码控制中。一旦进入源代码管理,Jenkins的工作就会对它做一些事情。

尽量保持尽可能基本,除了不同的连接字符串之外,不需要灵活性。我想尽可能避免使用PSSQL,用户抛出他们的连接字符串(数据库将是名称)并运行脚本,完成工作。

谁能指出我正确的方向?

sql-server powershell
1个回答
1
投票

只有在没有安装SqlServer模块或正在做一些不寻常的事情时才需要System.Data.SQLClient。这是一个更冗长的方法。

您只需要:

Import-Module SqlServer;

Invoke-Sqlcmd -ServerInstance '.\SQL2016' -Database 'TEST' -InputFile 'C:\dev\test\script.sql' | 
    Out-File -FilePath "C:\dev\test\output.sql"

但是...你的输出文件实际上不是.sql文件,除非script.sql中的查询实际上返回应该作为SQL执行的字符串。它应该是一个.txt文件。

根据你究竟产生了什么,你可能想要考虑Export-Csv -Path "C:\dev\test\output.csv" -NoTypeInformation而不是Out-File。我不知道你是在尝试导出数据还是仅仅记录信息。

此外,您需要确保没有在GO中使用批处理分隔符(script.sql),或者依赖于任何“SQLCMD模式”(在SQL Server Management Studio中调用)或其他sqlcmd.exe特定语法。 Invoke-Sqlcmd doc概述了两者之间的差异。如果你不知道那是什么,你可能很安全。

© www.soinside.com 2019 - 2024. All rights reserved.