Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用where子句插入到值中_Sql_Sql Server 2008_Sql Server 2005_Tsql - Fatal编程技术网

Sql 使用where子句插入到值中

Sql 使用where子句插入到值中,sql,sql-server-2008,sql-server-2005,tsql,Sql,Sql Server 2008,Sql Server 2005,Tsql,我试图以编程方式将值输入到表中 我不能直接使用Select@variables。我必须使用关键字值 在insert into中使用值时,如何创建where子句 我正在努力避免重复 DECLARE @MyID INT DECLARE @Phone varchar(10) DECLARE @MyDATE DateTime DECLARE @Agent as varchar(50) DECLARE @Charge as varchar(50) DECLARE @Vendor a

我试图以编程方式将值输入到表中

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

在insert into中使用值时,如何创建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)

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

尝试使用

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 
  )
此外,对于单个执行,Merge(UPSERT)选项也是一个很好的选项。 在本例中,未填充when matched,但可以添加when matched语句并更新时间戳或计数器

 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 
  );

根据经验,我更喜欢尽可能避免分支逻辑(使用IF)。
这是因为查询计划是基于它碰巧使用的第一次运行而缓存的,以备将来运行(这只是您可能使用的分支/路由的一种情况)

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

这样,您就可以在Insert语句中使用Where子句了:

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的合并(Upsert)。
根据我的经验,最好将插入内容和更新内容分别写出来,并且总是在插入之前更新。这避免了在更新新插入的记录(新创建的记录仍然临时锁定)时可能出现的随机/间歇性死锁。

为什么要在插入中使用where子句?你真的在尝试插入非重复项吗?是的。试图避免重复不是一个概念。如果您正在从另一个查询中选择数据,则数据源上的
WHERE
子句是有意义的。如果我真的想删除我的帖子,只需更新我即可删除我的帖子。这个话题已经4,5岁了。:-)@Tenzin那又怎样?这并不意味着人们不再为同一个问题寻找答案。可以证实,人们仍然在寻找答案。
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)