我正在尝试创建一个PowerShell脚本,该脚本将运行将更新SQL Server数据库的MS SQL脚本。 SQL脚本将保存在特定的文件夹中,并且在运行PowerShell之后,它应在不启动Management Studio的情况下运行脚本。
我有一个PowerShell命令,可以在PowerShell中启动并启动sqlcmd
,但是让我失望的是,当我使用PowerShell的Invoke-item
功能时,它正在启动Microsoft SQL Server管理工作室。我想要的是在脚本中传递登录凭据并运行SQL脚本,而无需启动SQL Server Management Studio。
PS C:\Users\Admin> $SqlServer = "localhost"
PS C:\Users\Admin> $SqlDBName = "Test"
PS C:\Users\Admin> $SqlConnection =New-Object System.Data.SqlClient.SqlConnection
PS C:\Users\Admin> $SqlConnection.ConnectionString ="Server = $SqlServer; Database =$SqlDBName; User id ='**'; password ='**'"
PS C:\Users\Admin> Invoke-Item 'D:\MSSQLScripts\AlterTable.sql'
AlterTable.sql就是这样
use Test
Alter table employee
add Dateofjoining date;
select * from Employee
因此,正在发生的事情是PowerShell正在触发AlterTable.sql
脚本并启动Microsoft SQL Server Management Studio登录页面。我希望这是无缝的-没有其他人参与。登录页面完全不能出现。在SqlConnection
字符串中传递凭据的原因是为了避免这种情况。它应该更改数据库,并且所有用户都应检查日志文件。
答案 0 :(得分:0)
将脚本读取为字符串,并将其传递给SqlCommand
object并执行:
$SqlScript = Get-Content D:\MSSQLScripts\AlterTable.sql -Raw
$SqlCommand = New-Object System.Data.SqlClient.SqlCommand
$SqlCommand.CommandText = $SqlScript
$SqlCommand.Connection = $SqlConnection
[void]$SqlCommand.ExecuteNonQuery()
答案 1 :(得分:0)
我设法通过用 Invoke-Sqlcmd 代替Get-Content来解决此问题。使用 Invoke-Sqlcmd ,我无需运行Microsoft SQL Management Studio就可以运行sql脚本。因此,在这种情况下,我使用的是 Invoke-Sqlcmd -InputFile(文件路径) ,它正在执行脚本。