使用控制台应用程序通过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执行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,双击就足够了