我的简单的SQL更新查询无法正常工作:(

时间:2009-09-25 06:17:43

标签: sql sql-server-2008 where-clause

我有一个简单的SQL查询试图更新单行。代码来自一些Linq-to-sql代码(我使用Profiler来抓取它),但请不要担心源代码(L2S)...这个问题是不可靠的。

现在,当我尝试使用where子句进行更新时,我会更新0行。

然后我尝试使用相同的select进行where clause。我得到一个结果。好的,所以数据就在那里。

只有当我关闭一些where clause statements时,查询才会起作用。我只是不明白:(

我无法解释它。所以我制作了一个显示这个的视频。

请观看YouTube here上的视频。

有人可以帮忙吗?这真的很奇怪:(

数据库是MS-SQL 2008。

- 更新

我正在尝试执行的sql(在我从L2S清除它之后)..

update tblBoardPost
    set IsSticky = 1
where IdBoardPost = 1278
    and IdAddress = 212787
    and Subject = N'ttreterte'
    and Banner is null
    and UniqueSubject = N'ttreterte5'
    AND (NOT ([IsAnnouncement] = 1)) 
    AND (NOT ([IsSticky] = 1)) 
    AND (NOT ([IsLocked] = 1)) 
    and IsVisible = 1
    and IdUserModified = 1
    AND [IdNewsArticle] IS NULL
    AND [IdList] IS NULL

(注意:是的,我知道NOT(blah = 1))很奇怪,但这就是L2S。

更新2:

视频中的代码正在事务/回滚转换中运行。这意味着,如果我确实运行其中一个奇怪的场景,那么更改有效..但回滚撤消它..所以当我第二次运行它时...原始值已经返回到db行。

另外,在vid中,select查询与更新查询并不完全相同..因为我一直在尝试这么多的排列(没有运气)..所以当我制作视频时..我忘了显示原始代码。也就是说,select语句和update / where语句中的相同代码(当我在我的机器上复制/粘贴时)再现完全相同的probs :(

更新2:)

根据列文的要求,这里的屏幕截图显示了代码,然后是结果。

alt text http://img196.imageshack.us/img196/7111/lieven.png

2 个答案:

答案 0 :(得分:0)

在视频中,您的选择就像

and not IsAnnouncement = 1

与您的更新中的结果完全不同

and not (IsAnnouncement = 1)

您似乎遇到了运营商优先问题。

修改

由于您的视频中的查询不匹配,虽然您说它们已匹配,但您可以复制以下脚本的粘贴,并告诉我们是否他们不会给您相同的结果? (我很难相信受影响的行会有所不同)

begin tran

select * 
from tblBoardPost      
where 
  IdBoardPost = 1278    
  and IdAddress = 212787    
  and Subject = N'ttreterte'    
  and Banner is null    
  and UniqueSubject = N'ttreterte5'    
  AND (NOT ([IsAnnouncement] = 1))     
  AND (NOT ([IsSticky] = 1))     
  AND (NOT ([IsLocked] = 1))     
  and IsVisible = 1    
  and IdUserModified = 1    
  AND [IdNewsArticle] IS NULL    
  AND [IdList] IS NULL

update tblBoardPost    
  set IsSticky = 1
where 
  IdBoardPost = 1278    
  and IdAddress = 212787    
  and Subject = N'ttreterte'    
  and Banner is null    
  and UniqueSubject = N'ttreterte5'    
  AND (NOT ([IsAnnouncement] = 1))     
  AND (NOT ([IsSticky] = 1))     
  AND (NOT ([IsLocked] = 1))     
  and IsVisible = 1    
  and IdUserModified = 1    
  AND [IdNewsArticle] IS NULL    
  AND [IdList] IS NULL

rollback tran

答案 1 :(得分:0)

我检查了您的视频,您应该尝试使用相同的SQL条件,即您在更新查询中用于在选择查询中返回一行的条件。视频中两个SQL语句的条件不一样,我真的不在乎为什么;他们不是苹果对苹果。

只需将工作WHERE子句复制并粘贴到不工作的子句上即可。