当一切正确且具有空字段时,不更新表。擦除空字段然后它有效吗?

时间:2014-11-11 20:38:24

标签: sql vb.net sql-server-2012

我有一个包含6列的表(fldAbsentes2)([fldEmployeeID],[fldAbsentDate],[fldAbsentCode]       [fldRuleViolationWarningType]       [fldRuleViolationIssueDate]       ,[fldLOAEndDate]

当我使用sqlcommand的quallowing querystring时,它不会给我一个错误,但它不会更新表。

 multstring = "Update tblAbsences2 " & _
                                "Set fldEmployeeID = '103', " & _
                                "fldAbsentDate =  '1/2/2013', " & _
                                "fldAbsentCode = 'X', " & _
                                "fldRuleViolationWarningType = NULL, " & _
                                "fldRuleViolationIssueDate = NULL, " & _
                                "fldLOAEndDate = NULL " & _
                                "Where (fldEmployeeID ='100') AND " & _
                                "(fldAbsentDate ='1/2/2013') AND " & _
                                "(fldAbsentCode ='NA') AND " & _
                                "(fldRuleViolationWarningType = NULL) AND " & _
                                "(fldRuleViolationIssueDate = NULL) AND " & _
                                "(fldLOAEndDate = NULL)"

如果我擦除最后三行(避免其中fldname = NULL)并且它可以工作。问题是用户应该能够更新这些值,如果它们是空的。当我使用sql Server管理工作室时,会发生同样的事情。下面也是关于sql管理VS的代码它只有在我擦除where fldname = NULL时才有效。任何帮助将不胜感激

UPDATE  [DBName].[dbo].[tblAbsences2] 
SET                fldAbsentCode = 'works', fldEmployeeID = '1', fldAbsentDate = '1/2/2013    00:00:00', fldRuleViolationWarningType = NULL, fldRuleViolationIssueDate = NULL, 
                     fldLOAEndDate = NULL
WHERE        (fldEmployeeID = '1') AND (fldAbsentDate = '1/2/2013 00:00:00') AND (fldAbsentCode =   'test') AND (fldRuleViolationWarningType = NULL) AND 
                     (fldRuleViolationIssueDate = NULL) AND (fldLOAEndDate = NULL)

2 个答案:

答案 0 :(得分:3)

SQL中的NULL比较运算符为IS而不是=(类似IS NOT而不是<>的不等式。

将您的查询更改为使用WHERE column IS NULL而不是WHERE column = NULL

答案 1 :(得分:2)

@dai关于IS NULL是否正确= NULL。那个shoudl修复了你的第一部分问题。但是,如果没有看到数据,我无法预测它是否会解决所有错误的问题。它也可能是你没有任何记录符合所有这些条件。您可能需要在dev上添加测试记录,以充分测试查询的准确性。

我还想提供一种技术来帮助您理解查询出错的原因,以便您无需借助互联网即可修复它。

UPDATE  [DBName].[dbo].[tblAbsences2] 
SET                fldAbsentCode = 'works'
                    , fldEmployeeID = '1'
                    , fldAbsentDate = '1/2/2013    00:00:00'
                    , fldRuleViolationWarningType = NULL
                    , fldRuleViolationIssueDate = NULL, 
                     fldLOAEndDate = NULL
--select * from      [DBName].[dbo].[tblAbsences2]                 
WHERE        (fldEmployeeID = '1') 
                    AND (fldAbsentDate = '1/2/2013 00:00:00') 
                    AND (fldAbsentCode =   'test') 
                    AND (fldRuleViolationWarningType = NULL) 
                    AND (fldRuleViolationIssueDate = NULL) 
                    AND (fldLOAEndDate = NULL) 

您将看到我在更新中嵌入了一个已注释掉的选择。只运行选择部分,您将看到更新会影响的结果。查看记录,看看它们是否有意义。在这种情况下,您可以消除最后3个条件(或其他查询的其他可疑条件),并查看这些字段的值在数据库中的含义。如果它们为null,那么您知道如何检查null是否有问题。如果不是,则可能是数据实际上并未提供具有所有这些条件的任何结果。要检查然后添加一些记录(仅在开发!!中)以添加您要查找的条件,然后运行选择并查看是否得到正确的答案。

这与此问题无关,但在检查查询的准确性时返回正确的结果时,您可能还需要删除联接或暂时将其更改为左联接,以查看导致您的数据发生的情况问题

如果不检查该查询的选择将返回什么,则永远不应创建更新或删除查询。 数据的含义驱动查询语法,如果您不确切知道您正在影响哪些记录,则无法知道您是否正确编写了查询。正如您在本案例中看到的那样,查询运行时,它没有语法错误。它根本没有返回正确的结果。是否通过语法检查并不意味着它应该做它应该做的事情。你需要学会按意义进行查询。