AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 78430
Accepted
David Thielen
David Thielen
Asked: 2014-10-06 14:31:39 +0800 CST2014-10-06 14:31:39 +0800 CST 2014-10-06 14:31:39 +0800 CST

如何获取作为存储过程中列表的局部变量?

  • 772

我在 C# 中有一些代码,我正在尝试移动到存储过程 - Sql Azure 不喜欢多次调用。所以一切都需要转移到过程中。

这是 C# 代码:

    List<string> addList = new List<string>(EmailDomains);
    List<string> deleteList = new List<string>();
    using (IDbCommand cmd = conn.CreateCommand())
    {
        cmd.Transaction = transaction;
        cmd.CommandText = "select * from CompanyDomains where CompanyDomains.CompanyId = @CompanyId";
        DbUtilities.AddParam(cmd, "@CompanyId", CompanyId);
        using (IDataReader reader = cmd.ExecuteReader())
        {
            int ordinal = reader.GetOrdinal("EmailDomain");
            while (reader.Read())
            {
                string domain = reader.GetString(ordinal).Trim();
                if (! addList.Remove(domain))
                {
                    deleteList.Add(domain);
                }
            }
        }
    }
    foreach (string domain in deleteList)
    {
        using (IDbCommand cmd = conn.CreateCommand())
        {
            cmd.Transaction = transaction;
            cmd.CommandText =
                "delete from CompanyDomains where CompanyDomains.CompanyId = @CompanyId and CompanyDomains.EmailDomain = @EmailDomain";
            DbUtilities.AddParam(cmd, "@CompanyId", CompanyId);
            DbUtilities.AddParam(cmd, "@EmailDomain", domain);
            cmd.ExecuteNonQuery();
        }
    }

    // deleted domains get added/updated to DeletedCompany
    foreach (string domain in deleteList)
    {
        DeletedCompany.InsertOrUpdate(conn, transaction, domain, CompanyName);
    }

    foreach (string domain in addList)
    {
        using (IDbCommand cmd = conn.CreateCommand())
        {
            cmd.Transaction = transaction;
            cmd.CommandText = "insert into CompanyDomains (CompanyId, EmailDomain) " +
                              "values (@CompanyId, @EmailDomain)";
            DbUtilities.AddParam(cmd, "@CompanyId", CompanyId);
            DbUtilities.AddParam(cmd, "@EmailDomain", domain.Trim());

            cmd.ExecuteNonQuery();
        }
    }

    // added domains get removed from DeletedCompany
    foreach (string domain in addList)
    {
                    using (IDbCommand cmd = conn.CreateCommand())
    {
        if (transaction != null)
            cmd.Transaction = transaction;
        cmd.CommandText = "delete from DeletedCompany where DeletedCompany.Domain = @Domain";
        DbUtilities.AddParam(cmd, "@Domain", domain);
        cmd.ExecuteNonQuery();
    }

    }

我完全停止的是我没有看到列表的任何等价物是 SQL。有没有办法在列表中建立所有这些?

或者我可以在选择使用我传入的列表的地方执行删除/插入/更新吗?我以定义的类型(表)的形式传递一个列表,它是新的域列表。从该列表中:

传入列表中不在 CompanyDomains 中的任何域都将添加到 CompanyDomains。

CompanyDomains 表中不在传入列表中的任何域 1) 从 CompanyDomains 中删除,以及 2) 添加/更新到 DeletedCompany 表。

liast 和 DeletedCompany 表中的任何域都将从 DeletedCompany 表中删除。

DeletedCompany.Domain 列在该表中是唯一的。所以添加到它必须是一个 upsert。

CompanyDomains 表也有一个 CompanyId 列,CompanyDomains.CompanyId = @CompanyId(将参数传递给 proc)。

这适用于 Sql Server 2008 和 Sql Azure。它不需要在其他任何东西上运行。

谢谢 - 戴夫

sql-server-2008 stored-procedures
  • 1 1 个回答
  • 221 Views

1 个回答

  • Voted
  1. Best Answer
    user507
    2014-10-06T18:25:45+08:002014-10-06T18:25:45+08:00

    我完全停止的是我没有看到列表的任何等价物是 SQL。有没有办法在列表中建立所有这些?

    所以listSQL Server 中的 a 基本上是一个表。您可以使用表值参数从 C# 传递完整列表。您基本上只需创建一个表类型来定义您传入的列表,请参阅 MSDN 链接中的示例。

    您只需要获取您在问题中列出的每个要求或 C# 正在执行的每个要求,并编写查询以从您的表值列表中提取正确的值,并根据这些值创建您INSERT的DELETE、 和语句。UPDATE

    因此对于

    传入列表中不在 CompanyDomains 中的任何域都将添加到 CompanyDomains。

    就像是:

    INSERT INTO CompanyDomains (<column list>
    SELECT <column list>
    FROM @TableParameter t
    WHERE NOT EXISTS ( SELECT domain FROM CompanyDomains cd WHERE t.domain = cd.domain );
    
    • 1

相关问题

  • 连接不同地理区域的数据库的最佳实践

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve