Powershell执行SQL SCRIPTS

时间:2016-01-09 14:54:51

标签: powershell

任何人都知道如何重写下面的代码,所以它可以调用sql脚本。例如,而不是把SELECT @@ SERVERNAME AS ServerName'在powershell脚本中,我想把它放到sql文件中。

$Path = "D:\AdminStuff\PowerShell\Password\Password.txt"
$uid = 'sa'
$pwd = Get-Content D:\AdminStuff\PowerShell\Password\Password.txt | ConvertTo-SecureString
$pwd.MakeReadOnly()


$creds = New-Object System.Data.SqlClient.SqlCredential($uid,$pwd)

$con = New-Object System.Data.SqlClient.SqlConnection
$con.ConnectionString = "Server=SLB-CLMFZ52;Database=master;"
$con.Credential = $creds
$con.Open()

$sql = "SELECT @@SERVERNAME AS ServerName"

$cmd = New-Object System.Data.SqlClient.SqlCommand($sql,$con)
$rdr = $cmd.ExecuteReader()
while($rdr.Read())
{
 $rdr["ServerName"].ToString()
}


$con.Close()

2 个答案:

答案 0 :(得分:0)

像这样简单的事情:

$sql=get-content $filename

答案 1 :(得分:0)

虽然可以使用您在问题中显示的SqlCredentialSqlConnectionSqlCommand .NET类,但有更简单的替代方法。例如,使用Invoke-Sqlcmd cmdlet代替的工作要少得多。 Invoke-Sqlcmd本质上是具有PowerShell伪装的古老sqlcmd实用程序。因此,假设您的查询位于文件myScript.sql中,您可以运行它 - InputFile参数提供了将SQL存储在您请求的单独文件中的方法:

$InvokeParams = @{
    Server = 'SLB-CLMFZ52'
    Database = 'Master'
    Username = 'sa'
    Password = 'xyz'
    InputFile = 'myScript.sql'
}
Invoke-SqlCmd @InvokeParams

现在明显的问题是,密码必须是纯文本。 (当然,OP中的密码也是文本中的纯文本。:-)遗憾的是Invoke-Sqlcmd不能与PowerShell凭证对象一起使用,这会使它更加安全。获得某些安全性的唯一合理解决方法是使用Windows身份验证而不是SQL身份验证。然后,您可以省略用户名和密码,并使用安全凭证调用查询:

$InvokeParams = @{
    Server = 'SLB-CLMFZ52'
    Database = 'Master'
    InputFile = 'myScript.sql'
}
Invoke-SqlCmd @InvokeParams

仅使用cmdlet Import-Module sqlps。有关Invoke-SqlCmd的基础知识,请查看TechNet并进行更深入的处理,包括sqlps的变幻莫测,请参阅我的Practical PowerShell for SQL Server Developers and DBAs文章的第1部分。