慧眼慧心 发表于 2023-9-14 12:22:46

只有在表中没有记录时才插入记录

我想知道记录是否只能插入表中而不包含记录?
是否有一个查询可以做到这一点,还是我需要一个存储过程?
                                                               
    解决方案:                                                               
                                                                你没说什么版本SQL Server。如果使用SQL Server
2008,则可以使用MERGE
注:合并通常用于注:Upsert,这是我最初认为的问题,但没有WHEN MATCHED子句且仅带WHEN NOTMATCHED在这种情况下,句子是有效的。用法示例。
CREATE TABLE #A( NOT NULL PRIMARY KEY CLUSTERED, (200) NOT NULL)    MERGE #A AS target    USING (SELECT 3,'C') AS source (id,C)    ON (target.id = source.id)    /*Uncomment for Upsert Semantics       WHEN MATCHED THEN         UPDATE SET C = source.C */    WHEN NOT MATCHED THEN            INSERT (id,C)      VALUES (source.id,source.C);就执行成本而言,当需要执行插入操作时,两者看起来大致相等…
链接到计划图像进行第一次操作
但在第二轮比赛中,马修的答案似乎更便宜,没有插入。我不确定是否有改进的方法。
链接到计划图像以进行第二次运行
测试脚本
select * into #testtablefrom master.dbo.spt_valuesCREATE UNIQUE CLUSTERED INDEX ON #testtable( ASC, ASC, ASC)declare @name nvarchar(35)= 'zzz'declare @number int = 50declare @type nchar(3) = 'A'declare @low intdeclare @high intdeclare @status int = 0;MERGE #testtable AS targetUSING (SELECT @name,@number,@type,@low,@high,@status) AS source (name,number,,low,high,)ON (target. = source. AND target. = source. and target. = source. )WHEN NOT MATCHED THEN    INSERT (name,number,,low,high,)VALUES (source.name,source.number,source.,source.low,source.high,source.);set @name = 'yyy'IF NOT EXISTS   (SELECT *    FROM #testtable    WHERE = @type AND = @number and name = @name)    BEGININSERT INTO #testtable(name,number,,low,high,)VALUES (@name,@number,@type,@low,@high,@status);END
页: [1]
查看完整版本: 只有在表中没有记录时才插入记录