2012-02-06 53 views
6

我试图以编程方式将值输入到我的表中。将值插入到where子句中

我不能直接使用Select @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) 
+0

为什么要在插入中使用where子句?你真的试图插入非重复? – 2012-02-06 19:42:38

+0

是的。试图避免重复 – 2012-02-06 19:43:35

+0

这不是一个概念。如果您从另一个查询中选择数据,那么'WHERE'子句对数据源有意义。 – HABO 2012-02-06 19:44:47

回答

22
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个选择: 1)使列是唯一的(在该列上创建索引并将其声明为唯一键,或者更好的是主键)2)使列自动递增。这样,你甚至不需要给它赋值。 4)你可以使用Joe Stefanelli的解决方案(在这个线程上)。它是程序员友好的,并允许你分配任何你想要的值。

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

这是http://stackoverflow.com/a/9166197/496972 – 2012-02-06 19:50:41

+0

复制是啊你是对的,我没有看到乔回答,而我张贴.. – 2012-02-06 19:51:36

+0

如果真的我想删除我的帖子,只是更新我所以我可以删除我的帖子 – 2012-02-06 19:53:43

0

而且合并尝试(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 
); 
+0

Ps这个主题是4,5岁。 :-) – Tenzin 2016-07-30 17:35:03

+4

@Tenzin那么,什么?这并不意味着人们不再为同一个问题寻找答案 – DixonD 2016-11-03 14:41:12