SQL Server插入到不存在的位置

SQL Server插入到不存在的位置,sql,sql-server-2012,Sql,Sql Server 2012,我正在尝试将值插入到一个表中,该表中的值不存在 这就是我目前的情况: insert into UToolDb.dbo.MQ_MESSAGES_NEW (ENVId, QueueName, CorrelationId, MessageId, MessageContent) select E.ENVId, 'RO00.GAT1.STUB_OPVANG_1.AI', '32303133313030343131353334393338343836373935

我正在尝试将值插入到一个表中,该表中的值不存在

这就是我目前的情况:

insert into UToolDb.dbo.MQ_MESSAGES_NEW (ENVId, QueueName, CorrelationId, MessageId, MessageContent) 
   select 
      E.ENVId,
      'RO00.GAT1.STUB_OPVANG_1.AI',
      '323031333130303431313533343933383438363739353032',
      'C3E2D840E2D8F1F24040404040404040CC0F7930FE822942', 
      'TEST Content'
   from 
      UToolDb.dbo.ENVIRONMENTS E 
   where 
      E.EnvironmentName = 'KETEN1' 
      and not exists (select 
                         EE.ENVId, 
                         'RO00.GAT1.STUB_OPVANG_1.AI',
                         '323031333130303431313533343933383438363739353032',
                         'C3E2D840E2D8F1F24040404040404040CC0F7930FE822942', 
                         'TEST Content'
                      from 
                         UToolDb.dbo.ENVIRONMENTS EE 
                      where 
                         EE.EnvironmentName = 'KETEN1'      
                         and EE.EnvironmentName = E.EnvironmentName)
出于某种原因,它没有插入:

 (0 row(s) affected).
表中不存在要插入的值


我做错了什么?

您正在从环境中获取一行,并再次检查同一表中是否不存在同一行

如果MQ_MESSAGES_NEW中已存在行而不是环境中的行,则可能需要找到解决方案:

insert into UToolDb.dbo.MQ_MESSAGES_NEW (
   ENVId,
   QueueName,
   CorrelationId,
   MessageId,
   MessageContent
) 
select 
   E.ENVId,
   ?,
   ?,
   ?, 
   ?
from UToolDb.dbo.ENVIRONMENTS E 
where E.EnvironmentName = 'KETEN1' 
and not exists(
   select 
      E.ENVId,
      M.*
   from UToolDb.dbo.ENVIRONMENTS E 
   left join UToolDb.dbo.MQ_MESSAGES_NEW M
   on E.ENVId = M.ENVId
   where E.EnvironmentName = 'KETEN1' 
   and QueueName = ?
   and CorrelationId = ?
   and MessageId = ?
   and MessageContent = ?
)

为什么要对EE.Environmentname进行双重检查?要进行故障排除,请自行运行子查询以查看是否有任何结果。与您的问题无关,当运行exists/Not exists查询时,在select子句中不需要太多。您所需要的只是从ETC中选择1。我现在唯一的问题是将变量从preparedstatement传递到查询第二部分中的“?”。有人知道吗?