【问题标题】:sql server if exists issuesql server 如果存在问题
【发布时间】:2013-10-27 00:14:26
【问题描述】:

您好,我被以下存储过程困住了。这就是我想要做的。

我有两个表:TableA 和 TableB。

  • TableA 具有称为 silo、slow 和 close 的列。
  • 表 B 具有称为 silo、partno、slow 和 close 的列。

.

  • 我有一个 HMI 程序,它是 将筒仓和零件发送给我,我将慢速和关闭发送回。
  • 我首先需要查看 TableA 并查看 tableA 中是否有与 HMI 发送给我的内容相匹配的 silo 和 partno。
  • 如果是这样,我只需将慢速和接近的 HMI 发送回(输出)。
  • 如果 TableA 没有 silo 和 partno,那么我需要
    • 仅在筒仓中查看 TableB 并选择顶部 1(可能有多个具有相同筒仓编号的行,因此我需要顶部 1)并将慢速和靠近 HMI 的发送回。
    • 我还需要将silo、partno(hmi 发送给我)、slow 和close(来自TableB)插入到TableA 的新行中。
  • 如果多次触发此过程,则不应继续插入 表 A 中的行。

我知道 if exists 或 where not exists 可以应用在这个过程中;但我只是不知道如何成功地做到这一点。代码如下。我很感激你的时间。非常感谢

附言errorout是通知hmi如果tableA和tableB没有现有的silo,slow,close,然后弹出一个消息框。就这样。 仅用于验证和通知目的。

USE [Product]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER Proc  [Controls].[spSiloSettings]

    @Silo int
    ,@PartNo Varchar (50)
    ,@Slow float output 
    ,@Close  float output 
    ,@errorout int output
AS

if  exists (select slow, close from controls.TableA where  @silo = silo and @partno= partno)

set @errorout = 0

select @slow= slow, @close = close 
    from TableA
    where @silo = silo  

if not exists(select  top 1 @silo = silo,  @slow= slow, @close = close)
    From controls.TableB
    Where silo = @silo

insert into controls.TableA (silo, partno, slow, close) 
    values (@silo, @partno ,@slow, @close)

end 

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    我想这就是你所追求的:

    USE [Product]
    GO
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER Proc  [Controls].[spSiloSettings]
        @Silo int
        ,@PartNo Varchar (50)
        ,@Slow float output 
        ,@Close  float output 
        ,@errorout int output
    AS
    BEGIN
        declare @found bit = 0
    
        set @errorout = 0
    
        select @slow = slow
        , @close = close 
        , @found = 1
        from controls.TableA 
        where silo = @silo 
        and partno = @partno 
    
        if @found != 1
        begin
    
            select top 1
              @found = 1
            , @slow= slow
            , @close = close
            From controls.TableB
            Where silo = @silo
            --order by something to ensure consistent results?
    
            if @found = 1
            begin
                insert into controls.TableA (silo, partno, slow, close) 
                values (@silo, @partno ,@slow, @close)
            end
            else
            begin
                @errorout = 1 --neither A nor B held the value we were after
            end
        end
    
    END
    

    【讨论】:

    • 这非常有效!非常感谢。我感谢您的时间和努力。也感谢 NikoalMarkovinovic!
    猜你喜欢
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2011-11-07
    • 2011-05-05
    • 2014-01-25
    相关资源
    最近更新 更多