使用控制台应用程序通过PowerShell执行SQL脚本文件
本文关键字:执行 SQL 脚本 文件 PowerShell 控制台 应用程序 | 更新日期: 2023-09-27 18:13:35
我想使用powershell文件脚本和控制台应用程序执行3个SQL文件。
我的控制台应用程序运行良好的适当的"powershell脚本",但我的问题是我应该写在我的脚本(dbscript.ps1)自动执行我的SQL文件。我看过几个例子,但都不符合我的情况。
我有ASP。. NET解决方案和我有3个SQL文件位于解决方案项目(没有子文件夹/没有子项目)。此外,我有一个项目,其中包含控制台应用程序执行我的ps1文件。
我真正需要的是:
a)我在app.config
中有一个连接字符串,可用于连接到我的本地DB
b)我需要在dbscript.pb1
中使用该连接字符串,然后我需要执行我的SQL文件(s1.sql
, s2.sql
, s3.sql
位于我的解决方案中)。
我看过这个例子:
$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "" // Here I should take my connection string from app.config
$conn.Open()
$sql = "" // Somehow I should take all my sql files (I don't know how to get the path for them)
$cmd = New-Object System.Data.SqlClient.SqlCommand($sql,$conn)
$rdr = $cmd.ExecuteReader()
$test = @()
while($rdr.Read())
{
$test += ($rdr["EMP_STATUS"].ToString())
}
Write-Output $test
所以,如何我能得到连接字符串从app.config
和我如何能设置所有的sql文件以特定的顺序执行?
不是你想要的,但我会这样做,因为当你已经在编写一个应用程序时,处理powershell似乎更令人头痛。
//get application path and script directory
private const string scriptPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Scripts");
private void RunScripts()
{
string[] scripts = Directory.GetFiles(scriptPath, "*.sql", SearchOption.TopDirectoryOnly);
//name them script01.sql, script02.sql ...etc so they sort correctly
Array.Sort(scripts);
if (scripts.Length > 0)
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionStringKey"]))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
foreach (string script in scripts)
{
cmd.CommandText = File.ReadAllText(script);
cmd.ExecuteNonQuery();
}
}
}
}
}
那么原因是.sql文件的数量。你可以只使用。bat。你甚至可以把。sql文件放在子文件夹中把。bat文件放在容器文件夹的根目录下:
C:'MySqlScripts
|
|_RunAllSqlFiles.bat
|
|_Functions
| |
| |_Function_1.sql
|
|_StoredProcedures
|
|_StoredProc_1.sql
.bat文件将递归地执行所有.sql文件,这里是RunAllSqlFiles.bat文件的内容:
@echo off
ECHO %USERNAME% process started at: %TIME% >output.txt
for /R %%i in (*.sql) do (
sqlcmd.exe -S tcp:SERVER_INSTANCE,1433 -E -d DB_NAME -i "%%i" >>output.txt
)
pause
必须修改SERVER_INSTANCE和DB_NAME。.bat使用sqlcmd和Windows身份验证
对于。bat,双击就足够了