我有一个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)
答案 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