我正在尝试以编程方式在我的表中输入值。
我不能直接选择@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 :(得分: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)。 根据我的经验,最好分别写出您的插入和更新,并始终在插入之前更新。这避免了在更新新插入的记录时潜在的随机/间歇性死锁(即在新创建后仍暂时锁定)。