C# ADO.NET 正在加载 SQL 包含多个语句和注释的脚本

C# ADO.NET Loading SQL Script with Multiple Statements and Comments

我正在构建一个应用程序,我将在其中根据针对许多不同数据库和服务器执行的一些 SQL 查询的结果生成一些报告。由于我无法在每台服务器上创建存储过程,因此我将 SQL 脚本保存在本地,将它们加载到我的 C# 应用程序中并使用 ADO.NET 针对每个服务器执行它们。所有 SQL 脚本都是选择 return table 的,但是,其中一些比其他脚本更复杂,并且涉及到 table 变量的多个选择,这些变量被加入,就像下面的超级基本示例。

我的问题是,使用 ADO.NET,是否可以将最终只有 return 单个数据 table 的多个 SQL 查询字符串分配给 SqlCommand对象 - 例如下面的两个 SELECT 语句构成了我的完整脚本?或者我是否必须创建一个事务并将每个单独的查询作为其自己的命令单独执行?

-- First Select
SELECT *
INTO #temp
FROM Table1;

--Second Select
SELECT *
FROM Table1
JOIN #temp
ON Table1.Id = #temp.Id;

此外,我的一些脚本中嵌入了注释,如上面的基本示例 - 这些是否需要删除,或者它们是否在字符串中被有效地忽略了?这似乎适用于单个查询,换句话说,“--这是一条评论”实际上被忽略了。

    private void button1_Click(object sender, EventArgs e)
    {
        string ConnectionString = "Server=server1;Database=test1;Trusted_Connection=True";
        using (SqlConnection conn = new SqlConnection(ConnectionString))
        {

            SqlCommand cmd = new SqlCommand("--This is a comment \n SELECT TOP 10 * FROM dbo.Tablw1;");
            DataTable dt = new DataTable();
            SqlDataAdapter sqlAdapt = new SqlDataAdapter(cmd.CommandText.ToString(), conn);
            sqlAdapt.Fill(dt);
            MessageBox.Show(dt.Rows.Count.ToString());
        }
    }

是的,那绝对没问题。评论被忽略。它应该工作正常。唯一要注意的是临时表的作用域——如果您习惯于使用存储过程,则作用域是临时的(当存储过程结束时它们会被删除);使用直接命令:不是 - 它们是特定于连接的,但在多个操作之间存在。如果这是一个问题,请查看 "table variables".

注意:技术上这取决于后端提供商;假设您使用的是标准数据库引擎,就可以了。如果您使用的是异国情调的东西,then 这可能是一个真正的问题。例如,它可能不适用于 "Bob's homemade OneNote ADO.NET provider".

我不使用 ado.net,我使用 Entity Framework 但我认为这更像是一个 SQL 问题而不是 ADO.NET 问题;如果我错了请原谅我。如果您在两个查询中都从 Table1 selecting,我认为您应该改用此查询。

select * 来自 Table1 tbl1 加入 Table1 tbl2 在 tbl1.id = tbl2.id

实际上,我真的从来没有看到您必须将内容移动到临时表中的原因,并且可以使用 Common Table Expressions 等选项。 如果您还不知道 CTE,请查找它们

https://www.simple-talk.com/sql/t-sql-programming/sql-server-cte-basics/

是的,你可以积极地做到。 您可以使用不同类型的集合,或者使用字符串生成器来传递查询,甚至可以放置字符串变量并将查询分配给它。

虽然循环 运行 放在临时 table 或 CTE 中,但这完全取决于您选择的方法。并将数据添加到 datatable.

所以如果你想插入或更新或删除整个数据,那么你可以进行交易,这不会有任何问题。