1

您好我被困在以下存储过程中。这是我想要做的。

我有两个表:TableA 和 TableB。

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

.

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

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

ps 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 
4

1 回答 1

2

我想这就是你所追求的:

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
于 2013-10-27T00:37:55.560 回答