Sql server 在存储过程中,若发现空值,则应跳过该插入查询

Sql server 在存储过程中,若发现空值,则应跳过该插入查询,sql-server,Sql Server,我有两张桌子,一张是 peson contains(personid Identity, firstname,Lastname,PlaceOfBirth,Gender) 还有一个 Education contains (Eduid identity, egreename,boardUniver,yearOfPassing,obtainedMarks, personid) 现在我的问题是,每个人都有1个以上的学位,但有些人有1或2个学位,所以我怎么能跳过insert查询呢 第一桌 Creat

我有两张桌子,一张是

peson contains(personid Identity, firstname,Lastname,PlaceOfBirth,Gender) 
还有一个

Education contains (Eduid identity, egreename,boardUniver,yearOfPassing,obtainedMarks, personid)
现在我的问题是,每个人都有1个以上的学位,但有些人有1或2个学位,所以我怎么能跳过insert查询呢

第一桌

Create table person(personid int Identity(1,1) primary key, firstname nvarchar(40), Lastname nvarchar(40), PlaceOfBirth nvarchar(40), Gender nvarchar(10))
第二桌

create table Education(Eduid int identity(1,1) primary key, Degreename nvarchar(40), boardUniver nvarchar(40), yearOfPassing nvarchar(40), obtainedMarks numeric(10,2), personid int, 
constraint fk_eduPerson foreign key (personid) references person(personid))
存储信息的过程

Create procedure EmpDetails
(
    @Firstname nvarchar(40),  @Lastname nvarchar(40), @PlaceOfBirth nvarchar(40), @Gender nvarchar(8), 
    @Degreename0 int, @boardUniver0 nvarchar(40), @yearOfPassing0 nvarchar(20), @obtainedMarks0 int,
    @Degreename1 int, @boardUniver1 nvarchar(40), @yearOfPassing1 nvarchar(20), @obtainedMarks1 int,
    @Degreename2 int, @boardUniver2 nvarchar(40), @yearOfPassing2 nvarchar(20), @obtainedMarks2 int, 
)
AS BEGIN
declare @personid int
INSERT INTO person(firstname,Lastname,PlaceOfBirth,Gender) values(@firstname,@Lastname,@PlaceOfBirth,@Gender)
SELECT @personid=@@IDENTITY
if(@Degreename0 !=NULL)
    BEGIN
    INSERT INTO Education(Degreename,boardUniver,yearOfPassing,obtainedMarks, personid) values (@Degreename0,@boardUniver0,@yearOfPassing0,@obtainedMarks0, @personid)
    END
IF(@Degreename1 !=null)
  BEGIN
    INSERT INTO Education(Degreename,boardUniver,yearOfPassing,obtainedMarks, personid) values (@Degreename1,@boardUniver1,@yearOfPassing1,@obtainedMarks1, @personid)
  END
IF(@Degreename2!=null)
   BEGIN
    INSERT INTO Education(Degreename,boardUniver,yearOfPassing,obtainedMarks, personid) values (@Degreename2,@boardUniver2,@yearOfPassing2,@obtainedMarks2,@personid)
    END
END
这不管用。。这将插入所有空行。。有没有其他解决办法?
如有其他建议,请提出来。。谢谢

请尝试将
改为
!=空
。在大多数关系数据库中,如果任一输入为
NULL
,则比较运算符返回false,即使两者都为。是一个SQL提琴来演示这种行为

(对不起,那个SQL小提琴真的很管用。)

诚然,这是令人困惑的,因为这一事实意味着所有的
INSERT
s都将被跳过。我在这里看不到任何会插入空行的内容。

试试这个-

Create procedure EmpDetails
(
    ...
)
AS BEGIN
    DECLARE @personid INT
    INSERT INTO Person (firstname, Lastname, PlaceOfBirth, Gender)
    SELECT @firstname, @Lastname, @PlaceOfBirth, @Gender

    SELECT @personid = SCOPE_IDENTITY()

    INSERT INTO Education (Degreename, boardUniver, yearOfPassing, obtainedMarks, PersonID)

    SELECT a = @Degreename0, b = @boardUniver0, c = @yearOfPassing0, d = @obtainedMarks0, e = @personid
    WHERE @Degreename0 IS NOT NULL

    UNION ALL

    SELECT @Degreename1, @boardUniver1, @yearOfPassing1, @obtainedMarks1, @personid
    WHERE @Degreename1 IS NOT NULL

    UNION ALL

    SELECT @Degreename2, @boardUniver2, @yearOfPassing2, @obtainedMarks2, @personid
    WHERE @Degreename2 IS NOT NULL

END

最好将此学位数据作为XML数据传递,如果在您的版本中不可用,则传递XML数据。这样,你就可以执行一个多行插入的行,就像你传递给你的一样多(你不需要编辑你的程序,如果某人有第四度),如果其中一个答案已经解决了你的问题,请考虑接受它作为答案。如果这些都没有修正你的问题,请考虑你自己的答案。经过一定时间后,StackOverflow将允许您接受自己的答案。