我有一个简单的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:)
根据列文的要求,这里的屏幕截图显示了代码,然后是结果。
答案 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子句复制并粘贴到不工作的子句上即可。