sql – INSERT IF NOT EXISTS但是返回身份的方式

我有3个表:audioFormats,videoFormats和fileInfo.
我有一个事务,当我插入到fileInfo表中,该插入包括来自audioFormats和videoFormats的FK.如果音频格式或视频格式不在这些表中,则将后面的表插入,然后将生成的(或现有的)ID值插入到fileInfo中.

只有在该值不存在时才能高效地插入值,而是获取该值的ID是否已经存在,或者仅使用sql(也可能是一个事务)新插入的值.

如果不存在,我可以插入一个值:

INSERT INTO audioformats (audioformat)
VALUES(@format)
WHERE NOT EXISTS (SELECT 1 FROM audioformats WHERE audioformat = @format)

我可以从插入中获取插入的ID:

INSERT INTO audioFormats (audioFormat)
VALUES ('Test')
SET @audioFormatId = ScopE_IDENTITY()

如果没有插入,ScopE_IDENTITY不会给我一个ID值.
我可以执行一个标量查询获取可能的插入后的身份,但似乎我应该能够做到这一切与最多一个SELECT和INSERT.

解决方法

您可以使用IF语句来执行此操作
IF NOT EXISTS(SELECT TOP 1 1 FROM audioformats WHERE audioformat = @format)
BEGIN
  INSERT INTO audioFormats (audioFormat)
  VALUES ('Test')
  SET @audioFormatId = ScopE_IDENTITY()
END
ELSE
BEGIN
  SELECT @audioFormatID = ID FROM audioformats WHERE audioformat = @format
END

或者你可以这样做:

INSERT INTO audioformats (audioformat)
  SELECT @format
  FROM audioFormats
  WHERE NOT EXISTS (SELECT TOP 1 1 FROM audioformats WHERE audioformat = @format)

SELECT @audioFormatID = ID FROM audioformats WHERE audioformat = @format

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...