【问题标题】:How to eliminate repetitive SQL queries to execute in different table names如何消除重复的 SQL 查询以在不同的表名中执行
【发布时间】:2019-02-08 07:29:47
【问题描述】:

我有一个代码块正在重复执行,但只更改了表名。

 SQLData stagingData = runtime.SQLExecuteQuery(integrationDatabase, "SELECT COUNT (*) AS ROW_COUNT FROM *<DATABASE NAME>*");

        foreach(SQLDataRow stagingDataRow in stagingData)
        {
            stageCount = runtime.SQLDataRowGetInteger(stagingDataRow, "ROW_COUNT");
        }

        if(stageCount !=0)
        {
            writeStaging = runtime.SQLExecuteStoredProcedure(integrationDatabase, "*<STORED PROCEDURE NAME>*", 0);
            SQLData transformedData = runtime.SQLExecuteQuery(integrationDatabase,
                "SELECT COUNT (*) AS ERROR_COUNT FROM *<TABLE NAME>* WHERE " +
                "[Entity] LIKE '_ERROR_%' OR [Name] LIKKE '_ERROR_'%");

            foreach (SQLDataRow transDataRow in transformedData)
            {
                errorCount = runtime.SQLDataRowGetInteger(transDataRow, "ERROR_COUNT");
            }

            if (errorCount == 0)
            {
                writeTransformed = runtime.SQLExecuteStoredProcedure(integrationDatabase, "*<STORED PROCEDURE NAME>*", 0);
            }
            else
            {
                return false;
            }
        }

这是重复执行的代码块。 斜体的项目是唯一变化的。

我们想减少这部分的行数,但我们找不到一个好的结构来做到这一点。

我们希望听到您的建议。

P.S.我们在一个类中执行这个。

谢谢。

【问题讨论】:

  • 您不能在 SQL 中参数化对象名称。所以......你会得到的最好的是某种模板化部分,从某个地方获取表名/存储过程名称(可能是配置、[SomeTableName("Foo")] 等属性、方法参数、抽象基类型上的虚拟属性, 等等)。抱歉,这里没有真正的整洁/神奇的解决方案。
  • 这听起来你应该用错误类型创建 1 个表,而不是每个表 1 个......
  • SQLServer 有一些执行字符串查询的命令。不知道MySql有没有这样的东西。如果有,您可以在数据库中创建存储过程。之后你的 C# 代码会更好看!
  • @AliDoustkani 只是移动了丑陋。你说的是sp_executesql 之类的东西,但是: still 不能参数化模式/对象/列名 - 所以你最终要做的就是从 C# 移动字符串 concat/replace到 SQL。我不认为这是一个优势,在很多方面它是一个劣势。 SQL 可以进行字符串操作,但 C# 在这些方面要好得多(在方便性和可读性方面)。
  • 感谢您的 cmets/建议,我会记住这些。

标签: c# mysql performance foreach


【解决方案1】:

需要对多个表执行相同的操作通常是糟糕的架构设计。请详细说明您的架构。

您可以编写存储过程来构造(通过CONCATPREPAREEXECUTE)对多个表的相同查询。它还可以询问information_schema.TABLES 以发现表名。

SELECT COUNT (*) AS ROW_COUNT FROM *&lt;DATABASE NAME&gt;* 是不可能的。您可以在 table 上执行 COUNT(*),但不能在 database 上执行。 (术语问题?一个“数据库”包含多个“表”;一个表包含“行”数据。)

【讨论】:

    猜你喜欢
    • 2011-05-29
    • 1970-01-01
    • 2023-02-08
    • 2021-11-07
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    相关资源
    最近更新 更多