有关使用SQL Server插入/更新行的问题(ASP.NET MVC)

时间:2010-06-15 04:45:26

标签: asp.net sql-server tsql upsert

我有一个非常大的表,有很多行,每一行都有特定日期的每个用户的统计数据。很明显,我没有任何未来的统计数据。所以要更新我使用的统计数据

UPDATE Stats SET Visits=@val WHERE ... a lot of conditions ... AND Date=@Today

但如果该行不存在怎么办?我必须使用

INSERT INTO Stats (...) VALUES (Visits=@val, ..., Date=@Today)

如何检查行是否存在?有没有办法做COUNT(*)?

如果我用空单元格填充表格,则需要数十万行占用兆字节并且不存储任何数据。

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

我会尝试UPDATE,如果@@ ROWCOUNT = 0,请尝试INSERT

UPDATE Stats SET Visits=@val WHERE ... a lot of conditions ... AND Date=@Today
IF @@ROWCOUNT = 0
   INSERT INTO Stats (...) VALUES (Visits=@val, ..., Date=@Today)

或者在TRY / CATCH中尝试INSERT,如果失败则尝试UPDATE。

我不会先测试

答案 2 :(得分:0)

在这些情况下,我倾向于执行以下操作(伪代码,因为我自己就是DB2人员):

try:
    INSERT
catch already-exists:
    try:
        UPDATE
    catch anything:
        generate error

如果您更有可能拥有行,则可以按相反的顺序执行此操作:

try:
    UPDATE
catch not-there:
    try:
        INSERT
    catch anything:
        generate error

从不首先在DBMS中进行测试,因为数据库可以在测试和执行之间进行更改(“更好地请求宽恕而非寻求许可”原则)。

答案 3 :(得分:0)

不幸的是,SQL Server没有任何类型的“INSERT OR UPDATE”命令(我知道),就像一些数据库引擎一样。这意味着您必须首先检查行或捕获其他答案建议的错误。希望你的行有一个人工主键,所以你可以首先使用所有WHERE条件查询该键,然后,如果返回一行,则执行UPDATE ... WHERE key = ...,否则执行INSERT。这样你就不会两次运行整个查询了。