SQL Server 2008 使用 case 语句查看错误

Posted

技术标签:

【中文标题】SQL Server 2008 使用 case 语句查看错误【英文标题】:SQL Server 2008 view error with case statement 【发布时间】:2011-11-22 19:19:25 【问题描述】:

我无法弄清楚为什么这段代码作为查询执行,但是当我在视图中执行它时,它会抛出一个多部分标识符无法绑定,错误。

当我取出case语句时它在视图中起作用,所以我认为它与case语句有关。

欢迎提出任何建议。

WITH [cteFrostSum] AS
(
    SELECT ID AS ID, theMonth  as Mo,
    SUM(dbo.Frost.[DRAmount])  AS [DRAmount]
    FROM dbo.Frost 
    GROUP BY [ID], theMonth
) 
SELECT DISTINCT 
    TOP (100) PERCENT      
    dbo.ternean.MemberID, 
    dbo.ternean.SSN, 
    dbo.ternean.GroupName, 
    dbo.ternean.CustomerID, 
    dbo.ternean.GroupNumber, 
    dbo.ternean.LastName, 
    dbo.Frost.DRAmount, 
    dbo.Frost.HittheBank, 
    dbo.Frost.MonthofPremium, 
    cte.[DRAmount] AS [SUM_Frost_Balance],
    dbo.ternean.TotalCost,
    cte.[DRAmount] - dbo.ternean.TotalCost AS Diff,
    dbo.ternean.ACH_RoutingNo, 
    dbo.Frost.RTNum, 
    dbo.ternean.ACH_AcctNo,
    dbo.Frost.AccountNumber, 

    CASE
        WHEN dbo.Frost.RTNum <> SUBSTRING(dbo.ternean.ACH_RoutingNo, 2, 20)
            THEN 'DO not match'
        WHEN dbo.Frost.RTNum = SUBSTRING(dbo.ternean.ACH_RoutingNo, 2, 20)
            THEN 'match'
    END AS [Routing # match], 
    CASE
        WHEN SUBSTRING(dbo.ternean.ACH_AcctNo, 2, 20) <> dbo.Frost.AccountNumber
            THEN 'DO not match'
        WHEN SUBSTRING(dbo.ternean.ACH_AcctNo, 2, 20) = dbo.Frost.AccountNumber
            THEN 'match'
    END AS [Account # match],
    dbo.Frost.theMonth
FROM dbo.Frost
INNER JOIN dbo.ternean ON dbo.Frost.ID = dbo.ternean.CustomerID
    AND dbo.Frost.theMonth = dbo.ternean.theMonth 
INNER JOIN [cteFrostSum] cte ON dbo.Frost.ID = cte.ID
    AND dbo.Frost.theMonth = cte.Mo
ORDER BY dbo.ternean.theMonth

【问题讨论】:

哪个多部分标识符不能绑定? ACH_RoutingNo 和 ACH_acctNo 的所有值的长度是否至少为 21 个字符? 换句话说:选择 ACH_RoutingNo, ACH_AcctNo from dbo.ternean T where len(T.ACH_RoutingNo) 这是标识符。无法绑定多部分标识符“dbo.Frost.RTNum”。无法绑定多部分标识符“dbo.Frost.RTNum”。无法绑定多部分标识符“dbo.Frost.AccountNumber”。无法绑定多部分标识符“dbo.Frost.AccountNumber”。 No ACH_RoutingNo 和 ACH_acctNo 的值不是 21 个字符,但将来可能是。 【参考方案1】:

我试图复制你的错误,但没有成功。

为什么你仍然使用多部分标识符作为字段名称? select语句中的字段列表只能引用from子句中的表,乍一看这个查询似乎是直接引用dbo schema中的表。

给你的表格一些简单易懂的别名,例如

FROM dbo.Frost AS F

并像这样使用它们

F.RTNum

其次,您可以简化案例陈述,只做一项测试,即:

CASE WHEN SUBSTRING(T.ACH_AcctNo, 2, 20) <> F.AccountNumber
    THEN 'DO not match'
    ELSE 'match'
END AS [Account # match]

【讨论】:

以上是关于SQL Server 2008 使用 case 语句查看错误的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2008 r2:当前会计年度 where 子句中的 case 语句

使用 SQL Server 2008 R2 的动态案例语句

SQL Server 2008 update语句只能更新1行数据?

SQL Case 语句子选择内的子选择分组

SQL中CASE WHEN THEN的用法

SQL2008中Merge的用法