if if inside if else sql

时间:2017-04-09 14:15:49

标签: sql sql-server if-statement

你知道为什么ELSE在我的代码中更受欢迎吗?最后的ELSE。我试图创建程序,但我有if子句

的问题

有人能帮助我吗?我知道最大值为id且向其添加1的解决方案并不好,但它是暂时的。后来我会尝试更好地实施

CREATE PROCEDURE dodajAuto
    (@marka VARCHAR, 
     @model VARCHAR, 
     @kolor VARCHAR, 
     @moc INT, 
     @dataProdukcji DATETIME, 
     @cena DECIMAL, 
     @typ VARCHAR, 
     @przebieg INT)
AS
BEGIN
    DECLARE @tmpMarka VARCHAR = (SELECT MARKA FROM MARKA WHERE MARKA=MARKA)
    DECLARE @tmpModel VARCHAR = (SELECT MODEL FROM MODEL WHERE MODEL=MODEL)

    DECLARE @tmpIdModelu INT = (SELECT IDMODELU FROM MODEL WHERE MODEL=MODEL)
    DECLARE @tmpIdMarki INT = (SELECT IDMARKI FROM MARKA WHERE MARKA=MARKA)

    DECLARE @tmpLastIdSamochodu INT = (SELECT MAX(IDSAMOCHODU) FROM SAMOCHOD)
    DECLARE @tmpLastIdModelu INT = (SELECT MAX(IDMODELU) FROM MODEL)
    DECLARE @tmpLastIdMarki INT = (SELECT MAX(IDMARKI) FROM MARKA)


    IF (@tmpMarka IS NOT NULL)
        IF (@tmpModel IS NOT NULL)
            INSERT INTO SAMOCHOD 
            VALUES (@tmpLastIdSamochodu+1, @tmpIdModelu, @kolor, @moc, @przebieg, @dataPRodukcji, @typ);
        ELSE
            INSERT INTO MODEL 
            VALUES (@tmpLastIdModelu+1, @tmpIdMarki, @model, @cena)

    SET @tmpIdModelu = (SELECT IDMODELU FROM MODEL WHERE MODEL = MODEL)

    INSERT INTO SAMOCHOD 
    VALUES (@tmpLastIdSamochodu+1, @tmpIdModelu, @kolor, @moc, @przebieg, @dataProdukcji, @typ);

    ELSE --THIS IS WHERE SYNTAX IS HIGLIHTED, 

    INSERT INTO MARKA VALUES (@tmpLastIdMarki+1, @marka)

    SET @tmpIdMarki  = (SELECT IDMARKI FROM MARKA WHERE MARKA = MARKA)

    INSERT INTO MODEL 
    VALUES (@tmpLastIdModelu+1, @tmpIdMarki, @model, @cena)

    SET @tmpIdModelu = (SELECT IDMODELU FROM MODEL WHERE MODEL = MODEL)

    INSERT INTO SAMOCHOD 
    VALUES (@tmpLastIdSamochodu+1, @tmpIdModelu, @kolor, @moc, @przebieg, @dataProdukcji, @typ);

1 个答案:

答案 0 :(得分:2)

ifelse仅适用于它们之后的单个语句。如果您要执行多步操作,请使用begin;end;对其进行分组。

始终声明varchar()nvarchar()数据类型的大小,以及decimal()numeric()数据类型的精度和比例。

Bad habits to kick : declaring VARCHAR without (length) - Aaron Bertrand

create procedure dodajAuto(
    @marka varchar(30)
  , @model varchar(30)
  , @kolor varchar(30)
  , @moc int
  , @dataProdukcji datetime
  , @cena decimal(18,0)
  , @typ varchar(30)
  , @przebieg int)
as
  begin;
  set nocount, xact_abort on;

  declare @tmpMarka varchar(30) = (select marka from marka where marka=@marka);
  declare @tmpModel varchar(30) = (select model from model where model=@model);

  declare @tmpIdModelu int = (select idmodelu from model where model=@model);
  declare @tmpIdMarki int = (select idmarki from marka where marka=@marka);

  declare @tmpLastIdSamochodu int = (select max(idsamochodu) from samochod);
  declare @tmpLastIdModelu int = (select max(idmodelu) from model);
  declare @tmpLastIdMarki int = (select max(idmarki) from marka);

  if (@tmpMarka is not null)
    if (@tmpModel is not null)

        insert into samochod values (@tmpLastIdSamochodu+1, @tmpIdModelu, @kolor, @moc, @przebieg, @dataprodukcji, @typ);
    else
      begin;
        insert into model values (@tmpLastIdModelu+1, @tmpIdMarki, @model, @cena);
        set @tmpIdModelu = (select idmodelu from model where model=@model);
        insert into samochod values (@tmpLastIdSamochodu+1, @tmpIdModelu, @kolor, @moc, @przebieg, @dataProdukcji, @typ);
      end;
  else
    begin;
      insert into marka values (@tmpLastIdMarki+1, @marka);
      set  @tmpIdMarki  = (select idmarki from marka where marka=@marka);
      insert into model values (@tmpLastIdModelu+1, @tmpIdMarki, @model, @cena);
      set @tmpIdModelu = (select idmodelu from model where model=@model);
      insert into samochod values (@tmpLastIdSamochodu+1, @tmpIdModelu, @kolor, @moc, @przebieg, @dataProdukcji, @typ);
    end;
  end;
go