2012-02-24 111 views
1

编辑:好的我想通了,我有一个if语句必须返回true才能运行SQL,这就是问题所在。我的SQL没有错。抱歉!SQL语句不更新任何行

我不知道这条语句有什么问题,但它不会更新任何行。

IF EXISTS (
    SELECT * 
    FROM dtRaces 
    WHERE 
     Date = @date 
    AND Location = @location 
    AND Time = @time 
) 
    UPDATE dtRaces SET 
    [email protected], 
    [email protected], 
    [email protected] 
    [email protected], 
    [email protected], 
    [email protected] 
    WHERE 
     Date = @date 
    AND Location = @location 
    AND Time = @time 
ELSE 
    INSERT INTO dtRaces (Date, Location, Time, City, State, Title) 
    VALUES (@date, @location, @time, @city, @state, @title) 

任何想法?我很难过。 这是SQL Server 2008,但我还没有学会如何使用MERGE。

+0

它会插入但不更新? – dasblinkenlight 2012-02-24 11:19:55

+2

“如果这些值存在行,请更新这些行以使其具有完全相同的值。”你没有看到这个问题? – 2012-02-24 11:19:59

+0

@AnthonyGrist - 是的,不完全确定OP在这里试图做什么。也许更新应该更新城市,州和标题领域,或者呢? – MatBailie 2012-02-24 11:25:31

回答

0

如果该行存在,您正在将行更新为相同的值。所以 - 它看起来像什么也没有发生。

如果创建更新后触发 - 你一定会看到它的运行

PS:总体行为是有点怪。

编辑:

现在它看起来更好,但你仍然没有需要更新一些值,以相同的价值观,看到这一点:

IF EXISTS (
    SELECT * 
    FROM dtRaces 
    WHERE 
     Date = @date 
    AND Location = @location 
    AND Time = @time 
) 
    UPDATE dtRaces SET 
    [email protected], 
    [email protected], 
    [email protected] 
    WHERE 
     Date = @date 
    AND Location = @location 
    AND Time = @time 
ELSE 
    INSERT INTO dtRaces (Date, Location, Time, City, State, Title) 
    VALUES (@date, @location, @time, @city, @state, @title) 

对于使用合并你有保证,这三列总是独一无二的:日期,时间,地点。如果是的话 - 的MERGE看起来就像这样:

MERGE dtRaces T 
USING (SELECT 1 S) S 
ON T.Date = @date AND T.Location = @location AND Time = @time 
WHEN MATCHED THEN UPDATE SET 
    [email protected], 
    [email protected], 
    [email protected] 
WHEN NOT MATCHED THEN 
    INSERT (Date, Location, Time, City, State, Title) 
    VALUES (@date, @location, @time, @city, @state, @title); 

PS:如果你的变量(@date,@time,@location)中的一个具有NULL的价值 - 你也将永远不会得到更新。

+0

对不起,我原来的帖子被编辑和不正确的更改。现在已经修复在UPDATE语句中包含其他值。 – user1230593 2012-02-24 20:24:10

+0

编辑:好的我想通了,我有一个if语句必须返回true才能运行SQL,这就是问题所在。我的SQL没有错。抱歉! – user1230593 2012-02-24 20:45:55

+0

已更新的答案。也看到最后一个PS。 – 2012-02-24 20:49:13

1

我建议你比较这些值。

开始

IF EXISTS (SELECT * FROM dtRaces WHERE Date = @date AND Location = @location AND Time = @time) 
begin 
print('exists') 
end 
else 
begin 
print('insert') 
end 

您可以更改打印语句来选择信息和进行比较。

+0

@OlegDok - 答案并不是说它们在逻辑上是不同的,只是有一个非常小的性能差异。据我回忆,实际上可能是真的,由于发动机内部的原因,网上有很多关于它的讨论。但它是无形的,它使*几乎*无*察觉*差异。我不知道你是如何证明-1的。特别是考虑到它可能在技术上是正确的。 – MatBailie 2012-02-24 11:28:20

+0

我删除了有关select 1而不是select *的声明,因为它引起争议,并且是在我上次测试它之前的几年前。 – Johan 2012-02-24 11:29:14

+0

@Dems - 据我所知 - Sql Server在EXISTS子句中根本不考虑列列表。所以 - 即使是微小的技术性能差异也没有。你可以通过拒绝访问某列到特定用户来检查它,并让这个用户使用SELECT * - 不会有安全错误,相反如果你做简单的选择* - 将会有一个\ – 2012-02-24 11:31:44

3

你已经得到了声明:

UPDATE dtRaces SET 
    [email protected], 
    [email protected], 
    [email protected] 
    WHERE 
     Date = @date 
    AND Location = @location 
    AND Time = @time 

这是更新的列有值,但只有在他们已经有这样的价值观 - 你永远不会看到从该更新的数据。

+0

对不起,我原来的帖子被编辑和不正确的更改。现在已经修复在UPDATE语句中包含其他值。 – user1230593 2012-02-24 20:23:36

+0

编辑:好的我想通了,我有一个if语句必须返回true才能运行SQL,这就是问题所在。我的SQL没有错。抱歉! – user1230593 2012-02-24 20:45:16

+0

@ user1230593:是的,它必须返回true。说过你的代码中的'EXISTS'应该没问题。 – 2012-02-24 22:17:36

0

好的我想通了,我有一个if语句必须返回true才能运行SQL,这就是问题所在。我的SQL没有错。抱歉!