Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 当连接十进制(8,0)字段时,SQL查询将永远挂起_Sql Server 2005 - Fatal编程技术网

Sql server 2005 当连接十进制(8,0)字段时,SQL查询将永远挂起

Sql server 2005 当连接十进制(8,0)字段时,SQL查询将永远挂起,sql-server-2005,Sql Server 2005,我有以下查询,可以正常工作: SELECT TMP_CLPUD.dbo.FormatS(RIGHT(SV1.VASLOC, 7), 9, 0) AS C_ACCOUNT, TMP_CLPUD.dbo.FormatS(Cust.C_CUSTOMER, 7, 0) AS C_CUSTOMER, CA.OID, CN2.NBCUNQ AS CUNQ, CN2.NBSUNQ AS SUNQ, 'AC' A

我有以下查询,可以正常工作:

SELECT      TMP_CLPUD.dbo.FormatS(RIGHT(SV1.VASLOC, 7), 9, 0) AS C_ACCOUNT, 
        TMP_CLPUD.dbo.FormatS(Cust.C_CUSTOMER, 7, 0) AS C_CUSTOMER, 
        CA.OID, 
        CN2.NBCUNQ AS CUNQ, 
        CN2.NBSUNQ AS SUNQ, 
        'AC' AS C_STATUS,
        TMP_CLPUD.dbo.mmsDATE(CN2.NBCNTE) AS IN_DATE, 
        TMP_CLPUD.dbo.mmsDATE(CN2.NBDSTE) AS OUT_DATE, 
        0 AS ARCHIVE
FROM        BILLING.SVP00100 AS SV1 INNER JOIN BILLING.CNP00200 AS CN2 ON SV1.VASUNQ = CN2.NBSUNQ
                                INNER JOIN BILLING.CMP00100 AS CM1 ON CN2.NBCUNQ = CM1.KACUST
                                INNER JOIN BILLING.CustomerAccounts AS CA ON CM1.KACUST = CA.CustomerNbr
                                INNER JOIN TMP_CLPUD.dbo.tblCustomers As Cust ON CA.OID = Cust.OID
                                INNER JOIN BILLING.Customers AS C ON CA.OID = C.OID
                                INNER JOIN BILLING.CNP00100 AS CN1 ON CN2.NBCUNQ = CN1.NACUNQ AND CN2.NBSUNQ = CN1.NASUNQ
ORDER BY C_ACCOUNT, C_CUSTOMER
但是,如果我尝试在CN1和CN2之间再链接一个字段,查询将无限期挂起。两个表中的字段类型均为十进制(8,0),不允许为空。以下是第三个链接的查询:

SELECT      TMP_CLPUD.dbo.FormatS(RIGHT(SV1.VASLOC, 7), 9, 0) AS C_ACCOUNT, 
        TMP_CLPUD.dbo.FormatS(Cust.C_CUSTOMER, 7, 0) AS C_CUSTOMER, 
        CA.OID, 
        CN2.NBCUNQ AS CUNQ, 
        CN2.NBSUNQ AS SUNQ, 
        'AC' AS C_STATUS,
        TMP_CLPUD.dbo.mmsDATE(CN2.NBCNTE) AS IN_DATE, 
        TMP_CLPUD.dbo.mmsDATE(CN2.NBDSTE) AS OUT_DATE, 
        0 AS ARCHIVE
FROM        BILLING.SVP00100 AS SV1 INNER JOIN BILLING.CNP00200 AS CN2 ON SV1.VASUNQ = CN2.NBSUNQ
                                INNER JOIN BILLING.CMP00100 AS CM1 ON CN2.NBCUNQ = CM1.KACUST
                                INNER JOIN BILLING.CustomerAccounts AS CA ON CM1.KACUST = CA.CustomerNbr
                                INNER JOIN TMP_CLPUD.dbo.tblCustomers As Cust ON CA.OID = Cust.OID
                                INNER JOIN BILLING.Customers AS C ON CA.OID = C.OID
                                INNER JOIN BILLING.CNP00100 AS CN1 ON CN2.NBCUNQ = CN1.NACUNQ AND CN2.NBSUNQ = CN1.NASUNQ AND CN2.NBCNTE = CN1.NACNTE
ORDER BY C_ACCOUNT, C_CUSTOMER

我尽我所能以各种不同的方式重写了这个东西,但每次我尝试链接第三个字段时,它就永远挂起。有什么建议吗?

如果要比较浮点数以获得精确匹配,通常会自找麻烦。克服这一问题的一种方法是取两个数字之差的绝对值,并将其与一个ε进行比较,比如1e-9,如果差值小于或等于这个ε,则可以假设两个浮点数相等

编辑 正如Lasse所指出的,尝试使用上述技术连接这些列将是一个混乱。如果您确实需要这种连接功能,另一种方法是不将数字存储为浮点,而是将它们存储为整数。例如,如果它是美元货币,你可以将123.45美元存储为12345美元$99.01将存储为9901。然后您可以加入整数值,这将避免所有的头痛与浮点数。要将整数转换回相应的浮点值,只需除以某个常量(美元货币示例中为100)


但我想问,为什么要加入这些类型的值,这似乎有点奇怪。

对于浮点数来说,等式总是有点粗略。如果您表示的是货币交易之类的东西,通常最好将它们存储为整数类型,如美分(或十分之一美分,或任何您愿意处理的最小硬币)。

那么,我们从使用浮点(无论多么精确)中学到了什么教训今天键入一个连接键?这将在连接中产生奇迹。你能说交叉连接比较吗(注意,不是对你的答案的批评,只是对这里的问题的观察:)@Lasse V.Karsen-是的,我在发布我的答案后开始思考这个问题,并且不确定加入它们的好方法,所以我同意你的观点:)。我猜这项技术在编程竞赛中效果相当不错,但在SQL连接中效果不太好;)。不过我同意,这是比较浮点值的“正确”方法。这里的问题是连接浮点值的整个概念。这是一个从未完成的原因。答案不错,但我怀疑这对OP有帮助,但我再次怀疑在这种情况下会有什么帮助:)@Lasse V.Karsen-是的,我也同意,正如我在编辑中所指出的那样。加入“数据”值似乎是不对的,但我还是不知道OP想要做什么。谢谢你的评论。不幸的是,我无法控制表中的数据类型。此查询是我设计的SSIS包的一部分,用于从传统计费系统到我们的软件的数据转换。实际上,我要比较的是一个日期值(比如19930621)。我不知道他们为什么选择将其存储在十进制字段中。我真的希望通过连接来实现这一点,因为在这个查询运行之后,我需要再次编写相同的查询,但是在CN1返回NULL的表上使用外部连接(查找CN2中所有在CN1中不存在的值)。