任何人都知道如何重写下面的代码,所以它可以调用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()
答案 0 :(得分:0)
像这样简单的事情:
$sql=get-content $filename
答案 1 :(得分:0)
虽然可以使用您在问题中显示的SqlCredential
,SqlConnection
和SqlCommand
.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部分。