在SQL Server 2005中的查询中与T-SQL进行数据比较

问题描述 投票:2回答:3

我想知道是否有人知道一个简单的方法来做到这一点。

我有几个数据表,这个数据是“静态的”,用户不会改变它,只有我才能插入/更新行。我想知道是否有一种简单的方法来插入不存在的行并更新不同的行。

我认为可行的方式是这样做:

IF((SELECT COUNT(*) FROM myTable WHERE myId = x) = 0)
   INSERT myTable() values()
ELSE
   UPDATE myTable SET data = updatedData WHERE myId = 0

但由于我想要更新很多行,我想知道是否有更简单的方法来做到这一点。在VS数据库中有一个数据比较器,是否可以从查询脚本或其他方式以某种方式使用它?我希望在使用VS部署数据库项目时完成这些更新。

sql visual-studio sql-server-2005
3个回答
1
投票

您可以在数据库上创建一个自动更新/插入行的触发器。


1
投票

您可以轻松删除if语句,如下所示:

insert into myTable
select
   <values>
where
   not exists(select * from myTable where myId = @x)

然后,您可以检查@@rowcount值。如果它不为零,则可以退出该逻辑部分,知道该记录已输入数据库。

如果@@rowcount为零,则表示该数据库中存在具有该id的记录,您可以发出更新:

update 
    myTable 
set 
    <values>
where 
    myId = @x

请注意,您要确保在事务中运行,因为如果您尝试从两个单独的客户端更新此代码,则可能会出现竞争条件。


0
投票

你所追求的是SQL Server 2008'MERGE'命令。这是MS文档页面http://technet.microsoft.com/en-us/library/bb510625.aspx

片段:

MERGE INTO dbo.myTable AS Target
USING (VALUES   ('something 1','other 1'), 
                ('something 2', 'other 2'), 
                ('something 3', 'other 3'))
       AS Source (Field1, Field2)
ON Target.myId = Source.myId
WHEN MATCHED THEN
    UPDATE SET Field1 = Source.Field1,
               Field2 = Source.Field2
WHEN NOT MATCHED BY TARGET THEN
    INSERT (Field1, Field2) 
    VALUES (Field1, Field2)

我从SQL2005标签中猜测这对你没什么帮助(对不起!),所以casperOne的答案可能是最合适的。

© www.soinside.com 2019 - 2024. All rights reserved.