使用where子句插入值

时间:2012-02-06 19:40:44

标签: sql sql-server-2008 sql-server-2005 tsql

我正在尝试以编程方式在我的表中输入值。

我不能直接选择@variables。我必须使用关键字值。

如何在insert into中使用Values时创建where子句。

我正在努力避免重复

  DECLARE @MyID INT
  DECLARE @Phone varchar(10)
  DECLARE @MyDATE DateTime
  DECLARE @Agent as varchar(50)
  DECLARE @Charge as varchar(50)
  DECLARE @Vendor as varchar(50)

  SET @MyID = 215199999
  SET @Phone = '9999999999'
  SET @MyDATE = '2010-12-04 11:56:12.000'
  SET @Agent = 'fbrown'
  SET @Charge = 'NO'
  SET @Vendor = 'NO'

  INSERT INTO [MyDB].[dbo].[Accounts]
  (MyID,Phone,MyDate,Agent,Charge,Vendor)
  VALUES (
  @MyID
  ,@Phone
  ,@MyDATE
  ,@Agent
  ,@Charge
  ,@Vendor 
  ) WHERE MyID NOT IN (@MyID)

5 个答案:

答案 0 :(得分:24)

IF NOT EXISTS(SELECT 1 FROM [MyDB].[dbo].[Accounts] WHERE MyID = @MyID)
    INSERT INTO [MyDB].[dbo].[Accounts]
        (MyID, Phone, MyDate, Agent, Charge, Vendor)
        VALUES 
        (@MyID, @Phone, @MyDATE, @Agent, @Charge, @Vendor)

答案 1 :(得分:3)

尝试使用

if not exists ( select top 1 * from [MyDB].[dbo].[Accounts] Where MyID = @MyID )
INSERT INTO [MyDB].[dbo].[Accounts]
  (MyID,Phone,MyDate,Agent,Charge,Vendor)
  VALUES (
  @MyID
  ,@Phone
  ,@MyDATE
  ,@Agent
  ,@Charge
  ,@Vendor 
  )

答案 2 :(得分:1)

如果您尝试确保MyID列不包含任何重复项,则至少有3个选项: 1)使列唯一(在该列上创建索引并将其声明为唯一,或者更好的是,主键) 2)使列自动递增。这样,您甚至不需要为其赋值。 4)你可以使用Joe Stefanelli的解决方案(在这个帖子上)。它是程序员友好的,并允许您分配您想要的任何值。

答案 3 :(得分:0)

Merge(UPSERT)选项对于单个执行来说也是一个不错的选择。 在此示例中,匹配时未填充,但您可以添加WHEN匹配的语句并更新时间戳或计数器。

 MERGE
   Accounts AS target
USING
(select  @MyID as myID ) AS source
ON
   target.myID = source.myID 

WHEN NOT MATCHED THEN
INSERT (MyID,Phone,MyDate,Agent,Charge,Vendor)
  VALUES (
  @MyID
  ,@Phone
  ,@MyDATE
  ,@Agent
  ,@Charge
  ,@Vendor 
  );

答案 4 :(得分:0)

根据经验,我宁愿尽可能避免使用分支逻辑(使用 IF)。
这是因为查询计划是基于它碰巧使用的 1st-Run 缓存以备将来运行
(这只是您可以采用的可能分支/路线的一种情况)。

为了避免这种情况,我在所有 DML 语句中包含 Where-Clauses(如果适用)。
这确保所有可能的 DML 操作都包含在查询计划中。
如果我发现这是不可能的(或过于复杂),那么这就是我用来确定是否应该创建一个新的 Sproc 来分支我的逻辑的代码味道。

除此之外,您可以这样为您的 Insert-Statement 使用 Where-Clause:

INSERT [MyDB].[dbo].[Accounts]
       (MyID, Phone, MyDate, Agent, Charge, Vendor)
SELECT @MyID,@Phone,@MyDate,@Agent,@Charge,@Vendor
 WHERE NOT EXISTS (SELECT * FROM [MyDB].[dbo].[Accounts] WHERE MyID = @MyID)

旁注:不惜一切代价避免 T-SQL 的 MERGE (Upsert)。 根据我的经验,最好分别写出您的插入和更新,并始终在插入之前更新。这避免了在更新新插入的记录时潜在的随机/间歇性死锁(即在新创建后仍暂时锁定)。