【问题标题】:Searching and inserting data if not exist using stored procedure使用存储过程搜索和插入数据(如果不存在)
【发布时间】:2020-07-06 03:40:54
【问题描述】:

我正在尝试使用存储过程插入数据,同时基于CustomerAccountNumber 进行搜索。有什么办法可以用较短的形式编写以下代码?我应该为此在数据库中创建一个存储过程还是直接使用它从 VB 中插入?

declare @Customer int ,@AccountNumber int

IF NOT EXISTS (SELECT * FROM Table_A 
               WHERE AccountNumber = @AccountNumber AND Customer = @Customer)
BEGIN
    INSERT INTO Table_A 
        SELECT TOP 1 *
        FROM Table_B
        WHERE AccountNumber = @AccountNumber AND Customer = @Customer 
END

IF NOT EXISTS (SELECT * FROM Table_A 
               WHERE AccountNumber = @AccountNumber AND Customer = @Customer)
BEGIN
    INSERT INTO Table_A 
        SELECT TOP 1 *
        FROM Table_C
        WHERE AccountNumber = @AccountNumber AND Customer = @Customer 
END

IF NOT EXISTS (SELECT * FROM Table_A 
               WHERE AccountNumber = @AccountNumber AND Customer = @Customer)
BEGIN
    INSERT INTO Table_A 
        SELECT TOP 1 *
        FROM Table_D
        WHERE AccountNumber = @AccountNumber AND Customer = @Customer 
END

【问题讨论】:

  • 不使用IF 语句,而是将条件添加到WHERE 子句。 是否应该您创建一个 SP - 完全取决于您。
  • 建议列出insert 语句的列,更清晰,以后不太可能导致问题。
  • 我正在检查表 A 中是否不存在记录,然后仅从表 B 或 C 或 D 中插入。您的意思是为表添加 where 条件吗?我将添加列列表。
  • 另外:使用 TOP 1 withoutORDER BY 是非常没用的 - 你得到 1 个任意列,因为你没有定义你想要你的行由.....订购
  • Table_B、Table_C 和 Table_D 使用 UNION ALL 怎么样?

标签: sql-server vb.net


【解决方案1】:

在这里结合所有的 cmets 是一些更短的代码。注意事项:

  1. 建议始终完整列出INSERT 语句中涉及的列。它更清楚正在发生的事情,如果您有 IDENTITY 列,或者将来更改您的表定义,也不会导致问题。

  2. 没有ORDER BYTOP 1 将返回随机结果,这通常不是您想要的。

    INSERT INTO Table_A 
    SELECT *
    FROM (
        SELECT TOP 1 *
        FROM Table_B
        WHERE AccountNumber = @AccountNumber AND Customer = @Customer
        UNION ALL
        SELECT TOP 1 *
        FROM Table_C
        WHERE AccountNumber = @AccountNumber AND Customer = @Customer
        UNION ALL
        SELECT TOP 1 *
        FROM Table_D
        WHERE AccountNumber = @AccountNumber AND Customer = @Customer
    ) X
    WHERE NOT EXISTS (
        SELECT 1
        FROM Table_A A
        WHERE A.AccountNumber = X.AccountNumber AND A.Customer = X.Customer
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2012-01-23
    • 1970-01-01
    • 2017-04-24
    • 2015-02-10
    相关资源
    最近更新 更多