2011-08-04 53 views
1

我们计划将应用程序从Sybase SQL Anywhere转换为SQL Server。现有更新中的SQLServer

在SA中,我们使用大量“on existing update”,通过主键检查是否存在行。 如果为true,则更新(如果我正在执行更新子句,则以同样的方式)。 如果没有,则插入。

SQL Server是否支持这样的事情?

回答

1

AFAIK在一个命令中没有对此的支持。我发现的最好方法是按照Jeremiah Clark's tip:尝试更新,然后检查受影响记录的数量。如果是零,那么我插入:

UPDATE Table1 SET (...) WHERE Column1='SomeValue' 
IF @@ROWCOUNT=0 
    INSERT INTO Table1 VALUES (...) 
+0

我正在寻找避免测试的方法。但如果它没有,可能我会用这种方式。 – Zote

0

SQL Server有一个高端的RDBMS,存储过程,触发器,UDF的所有功能等等......你可能知道MS SQL服务器被分支完全从Sybase出来,所以它们确实有共同之处。

我不确定我完全得到你的问题,当然你可以有一个SQL语句包含一些逻辑并根据一些条件进行INSERT或UPDATE,或者如果已经找到记录,TSQL是SQL的SQL方言服务器并支持这一点以及更多。

如果您确实对某个声明有具体疑问或疑问,请立即向我们提供您的声明,因为您现在已在SA中。

+0

在现有更新值(1,'ABC',123)上插入TableA(id,value1,value2); – Zote

+0

如果TableA具有id(pk)等于1的行,它将更新。如果没有,它会插入。 – Zote

+0

FYI SQL Server从Sybase __ASE__分支。 Sybase SQL Anywhere是与ASE没有共同代码的完全不同的RDBMS。 –

1

如果您将使用SQL Server 2008及更高版本,则可以使用MERGE命令。你可以在这里找到描述:

http://technet.microsoft.com/en-us/library/bb510625(SQL.100).aspx

如果使用旧的SQL,耶利米克拉克的解决方案通过埃里克·萨瑟建议都会好的。

+0

是的,我们正在使用2008 R2。我会和我的团队讨论这个命令。谢谢。 – Zote