SQL Server 2005批量插入拆分字符串不存在

时间:2014-01-16 22:27:31

标签: sql sql-server-2005

我有一个insert语句的问题,我无法让“where not exists”子句工作。我更喜欢一个解决方案,我不必将列表转储到声明的表中。以下是我尝试过的两种解决方案,有人可以告诉我的语法错误吗?我的拆分字符串列表有三个值,前两个值是新的,但第三个值已经存在于数据库中,因此不应插入。

使用此示例,我根本没有返回任何数据:

 insert into dbo.Cook(Id, CookId, DateEntered, Active) 
    select 
        @Id, value as CookId, getDate(), 1 
    from 
        dbo.Split('123456,234567,345678', ',')
    left join 
       dbo.Cook ck on ck.Id = @Id
    where 
       not exists (select CookId from dbo.Cook where Id = @Id)

然后我尝试了一个带有表格的版本,它最终返回我的@ids表中的所有值,包括可能重复的cook号:

 declare @ids table (id int)

 insert into @ids 
     select value as id 
     from dbo.Split('123456,234567,345678', ',')

 insert into dbo.Cook(Id, CookId, DateEntered, Active) 
    select 
       @Id, id as CookId, getDate(), 1 
    from 
       @ids
    left outer join 
       dbo.Cook ck on ck.CookId = id
    where 
       not exists (select CookId from dbo.Cook where ck.CookId != id)

2 个答案:

答案 0 :(得分:0)

除了忽略将from条款放在新行 cringe 之外,我相信这是你的语法。

我不明白你在这里要做什么。据我所知,dbo.Split在SQL Server中不是内置函数。

答案 1 :(得分:0)

我解决了我的问题,感谢一位程序员。我的问题是我应该在select语句上进行连接并添加一个比较列来获取我正在寻找的信息。解决方案是:

insert into dbo.Cook(Id, CookId, DateEntered, Active) 
select 
    @Id, value as CookId, getDate(), 1
from 
    dbo.Split('123456,234567,345678', ',') c
left join 
   (select cook from dbo.Cook where Id = @Id) cook on cook.Id = c.value
where 
   cook.Id is null