sql server(如果存在)问题

sql server(如果存在)问题,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,您好,我被以下存储过程卡住了。这就是我要做的 我有两张桌子:桌子A和桌子B TableA中的列名为silo、slow和close 表B中的列名为silo、partno、slow和close 我有一个HMI程序 发送给我筒仓和零件号,我将返回慢速和关闭 我首先需要查看TableA,看看TableA中是否有一个思洛存储器和partno,它与HMI发送给我的信息相匹配 如果是这样,我只需将缓慢且接近HMI(输出)的信号发送回 如果TableA没有筒仓和零件号,那么我需要 仅查看表B中的思洛存

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

我有两张桌子:桌子A和桌子B

  • TableA中的列名为silo、slow和close
  • 表B中的列名为silo、partno、slow和close

  • 我有一个HMI程序 发送给我筒仓和零件号,我将返回慢速和关闭
  • 我首先需要查看TableA,看看TableA中是否有一个思洛存储器和partno,它与HMI发送给我的信息相匹配
  • 如果是这样,我只需将缓慢且接近HMI(输出)的信号发送回
  • 如果TableA没有筒仓和零件号,那么我需要
    • 仅查看表B中的思洛存储器,选择顶部1(可能有多行具有相同的思洛存储器编号,因此我需要顶部1),然后将慢速和接近HMI的数据发送回
    • 我还需要将思洛存储器、零件号(hmi发送给我)、慢速和关闭(从表B)插入表a中的新行
  • 如果此过程被多次触发,则不应继续插入 表格中的行
我知道如果存在或不存在,可以在本程序中应用;但我只是不知道如何成功地做到这一点。代码如下。谢谢你抽出时间。多谢各位

p、 s.errorout是通知hmi,如果tableA和tableB没有现有的思洛存储器,请减速并关闭,然后弹出一个消息框。就这些。 仅用于核实和通知目的

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 

我想这就是你想要的:

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

这工作做得很好!非常感谢你。我感谢你的时间和努力。也谢谢尼科阿尔马尔科维诺维奇!