相关疑难解决方法(0)

SQL Server插入(如果不存在)

我想在我的表中插入数据,但只插入我的数据库中不存在的数据!

这是我的代码:

ALTER PROCEDURE [dbo].[EmailsRecebidosInsert]
  (@_DE nvarchar(50),
   @_ASSUNTO nvarchar(50),
   @_DATA nvarchar(30) )
AS
BEGIN
   INSERT INTO EmailsRecebidos (De, Assunto, Data)
   VALUES (@_DE, @_ASSUNTO, @_DATA)
   WHERE NOT EXISTS ( SELECT * FROM EmailsRecebidos 
                   WHERE De = @_DE
                   AND Assunto = @_ASSUNTO
                   AND Data = @_DATA);
END
Run Code Online (Sandbox Code Playgroud)

错误是:

消息156,级别15,状态1,过程EmailsRecebidosInsert,第11行
关键字'WHERE'附近的语法不正确.

sql sql-server stored-procedures sql-server-2008

205
推荐指数
10
解决办法
49万
查看次数

如何忽略T-SQL中的"重复键"错误(SQL Server)

我有一个包含多个SQL语句(INSERT,UPDATE和/或DELETES)的事务.执行时,我想忽略重复错误语句并继续下一个语句.这样做的最佳方法是什么?

sql sql-server

50
推荐指数
5
解决办法
11万
查看次数

如果EXISTS,那么选择ELSE INSERT然后选择

How do you say以下Microsoft SQL Server 2005:

IF EXISTS (SELECT * FROM Table WHERE FieldValue='') THEN
   SELECT TableID FROM Table WHERE FieldValue=''
ELSE
   INSERT INTO TABLE(FieldValue) VALUES('')
   SELECT TableID FROM Table WHERE TableID=SCOPE_IDENTITY()
END IF
Run Code Online (Sandbox Code Playgroud)

我要做的是查看是否已经有一个空白的fieldvalue,如果有则返回TableID,否则插入一个空白的fieldvalue并返回相应的主键.

sql t-sql sql-server sql-server-2005

49
推荐指数
3
解决办法
40万
查看次数

在SQL Server 2005上INSERT WHERE COUNT(*)= 0上违反UNIQUE KEY约束

我从多个进程插入一个SQL数据库.过程有时可能会尝试将重复数据插入表中.我试图以一种处理重复的方式编写查询,但我仍然得到:

System.Data.SqlClient.SqlException: Violation of UNIQUE KEY constraint 'UK1_MyTable'. Cannot insert duplicate key in object 'dbo.MyTable'.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)

我的查询看起来像:

INSERT INTO MyTable (FieldA, FieldB, FieldC)
SELECT FieldA='AValue', FieldB='BValue', FieldC='CValue'
WHERE (SELECT COUNT(*) FROM MyTable WHERE FieldA='AValue' AND FieldB='BValue' AND FieldC='CValue' ) = 0
Run Code Online (Sandbox Code Playgroud)

约束'UK1_MyConstraint'表示在MyTable中,3个字段的组合应该是唯一的.

我的问题:

  1. 为什么这不起作用?
  2. 我需要进行哪些修改才能因违反约束而无法出现异常?

请注意,我知道还有其他方法可以解决"INSERT if not exists"的原始问题,例如(摘要):

  • 使用TRY CATCH
  • 如果不存在INSERT(在具有可序列化隔离的事务中)

我应该使用其中一种方法吗?

编辑1个 SQL用于创建表:

CREATE TABLE [dbo].[MyTable](
  [Id] [bigint] IDENTITY(1,1) NOT NULL,
  [FieldA] [bigint] NOT NULL,
  [FieldB] [int] NOT NULL,
  [FieldC] [char](3) NULL,
  [FieldD] [float] …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2005

21
推荐指数
2
解决办法
3万
查看次数

如何在不存在的情况下插入?

我想将插入查询与"不存在的地方"结合起来,以免违反PK约束.但是,如下所示的语法给我一个Incorrect syntax near the keyword 'WHERE'错误 -

INSERT INTO myTable(columns...)
VALUES(values...)
WHERE NOT EXISTS
   (SELECT *
    FROM myTable
    WHERE pk_part1 = value1,
        AND pk_part2 = value2)
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?

(通常,您可以将插入与where子句组合使用吗?)

sql sql-server insert not-exists

18
推荐指数
1
解决办法
4万
查看次数

INSERT INTO如果不存在SQL服务器

我有一个数据库结构如下:

用户

userid (Primary Key)
username
Run Code Online (Sandbox Code Playgroud)

groupid (PK)
groupName
Run Code Online (Sandbox Code Playgroud)

user_groups

userid (Foreign Key)
groupid (Foreign Key)
Run Code Online (Sandbox Code Playgroud)

用户第一次登录时,我希望将他们的信息添加到users表中.所以基本上我想要的逻辑是

if (//users table does not contain username)
{
INSERT INTO users VALUES (username);
}
Run Code Online (Sandbox Code Playgroud)

如何使用SQL Server/C#智能地执行此操作?

c# sql sql-server database-design

14
推荐指数
2
解决办法
4万
查看次数

SQL INSERT但避免重复

我想做一些快速插入,但避免重复到表中.为了论证,我们称之为MarketPrices,我一直在尝试两种方法,但不确定如何更快地进行基准测试.

INSERT INTO MarketPrices (SecurityCode, BuyPrice, SellPrice, IsMarketOpen)
SELECT @SecurityCode, @BuyPrice,  @SellPrice, @IsMarketOpen
EXCEPT
SELECT SecurityCode, BuyPrice, SellPrice, j.bool as IsActive FROM MarketPrices
CROSS JOIN (SELECT 0 as bool UNION SELECT 1 as bool ) as j
Run Code Online (Sandbox Code Playgroud)

要么

DECLARE @MktId int
SET @MktId = (SELECT SecurityId FROM MarketPrices 
              where SecurityCode = @SecurityCode 
              and BuyPrice=@BuyPrice 
              and SellPrice = @SellPrice)

IF (@MktId is NULL)  
BEGIN
    INSERT INTO MarketPrices (SecurityCode, BuyPrice, SellPrice, IsMarketOpen)
    VALUES
    (@SecurityCode,@BuyPrice, @SellPrice, @IsMarketOpen)
END
Run Code Online (Sandbox Code Playgroud)

假设这@whatever是存储过程中的输入参数.

我希望能够在BuyPrice或SellPrice或两者与之前的其他所有事件不同时为每个SecurityCode插入新记录.我不关心IsMarketOpen.

关于上述任何一种方法,有什么明显的愚蠢之处吗?一个比另一个快吗?

sql sql-server sql-server-2005

11
推荐指数
2
解决办法
2万
查看次数

Sql Server 2005 - 如果不存在则插入

互联网上有很多关于这个常见"问题"的信息.

解决方案如:

IF NOT EXISTS() BEGIN INSERT INTO (...) END
Run Code Online (Sandbox Code Playgroud)

在我看来并不是线程安全的,你可能会同意.

但是你能否确认将exists存入一个select的where子句会解决sql引擎中最高并发性的问题?够了吗?

insert into Table (columns)
select column1, column2, column3
where not exists (select top 1 1 from Table where something)
Run Code Online (Sandbox Code Playgroud)

应该在那里还添加了一些更高的事务级别,还是可以在默认的一个上执行:commit?

这会在未提交的水平下工作吗?

谢谢!

//稍后添加

我可以假设两个sql'都是正确的:

1)设置事务隔离级别可重复读取

   IF NOT EXISTS() BEGIN INSERT INTO (...) END
Run Code Online (Sandbox Code Playgroud)

2)设置事务隔离级别可重复读取

insert into Table (columns)
select column1, column2, column3
where not exists (select top 1 1 from Table where something)
Run Code Online (Sandbox Code Playgroud)

sql-server transactions insert exists

7
推荐指数
1
解决办法
4835
查看次数

哪个是delete-insert和if-update else-insert的最佳选择?

更新:

我的不好......我在那些桌子上有一个主键......我的意思是目前没有进一步的索引.在看到性能之后我们可能会在将来看到它,并且由于我们在检索数据时对数据有太多过滤器,因此上次我们运行数据库调优时索引没有显示出太大的改进.

数百万条记录中有4张巨大的表格.现在存在经常调用的存储过程并更新这些表.这是场景 -

现在,如果今天存在条目,我需要今天更新它,否则如果用户没有输入,我需要继续为用户插入条目.现在有两种方法可以执行这些,因为只有一个proc可以执行此操作 -

第一道 -

IF EXISTS(TABLE1)
--UPDATE where condn
ELSE
--INSERT
IF EXISTS(TABLE2)
--UPDATE where condn
ELSE
--INSERT
IF EXISTS(TABLE3)
--UPDATE where condn
ELSE
--INSERT
IF EXISTS(TABLE4)
--UPDATE where condn
ELSE
--INSERT
Run Code Online (Sandbox Code Playgroud)

第二种方式 -

DELETE from TABLE1 where condn
DELETE from TABLE2 where condn
DELETE from TABLE3 where condn
DELETE from TABLE4 where condn

INSERT TABLE1 ENTRY
INSERT TABLE2 ENTRY
INSERT TABLE3 ENTRY
INSERT TABLE4 ENTRY
Run Code Online (Sandbox Code Playgroud)

现在第二种方式看起来更简单,但可能更耗时......我不确定哪种方式最好.任何人都可以帮助或指导我在这里..谢谢!

sql-server-2005 query-optimization

6
推荐指数
2
解决办法
1658
查看次数

在插入之前检查主键值是否比使用try-catch更快?

基本上我有一个带有双字段主键列(memberid,messageid)的表,我有一个存储过程,在该表中插入一个新行.

现在我检查是否存在具有PK的行并且如果没有则插入,但是当我在检查之后和实际插入之前由不同进程插入行时我已经遇到了这种情况,所以我在想另一种方式.

我不想出于性能原因使用事务,所以我想把INSERT放入try-catch并完全跳过检查.如果该行已存在,则insert将失败,但将被"catch"静音,这是正常的.

我的问题是 - 抛出错误并将其捕获到昂贵的操作中?

sql-server performance sql-server-2008

6
推荐指数
1
解决办法
1268
查看次数