【问题标题】:attribute key was not found - MS SQL Server未找到属性键 - MS SQL Server
【发布时间】:2015-04-14 14:54:43
【问题描述】:

我在 MS SQL Server 上收到以下消息(我正在翻译德语):

"表'VF_Fact',列ORGUNIT_CD,值:1185。属性为 ORGUNIT_CD。由于未找到属性键,因此删除了行。 属性:数据库中“组织”维度中的 ORGUNIT_CD '仪表板',立方体'盒子立方体'......”

我检查了事实表“VF_Fact”和 ORGUNIT_CD 列 - 在那里我找到了值“1185”。 ORGUNIT_CD 列在视图中定义如下:

CAST(  COALESCE( emp.ORGUNIT_CD, 99999999 ) AS char(8)) AS ORGUNIT_CD,

此外,视图从 L_Employee_SAP TABLE 中检索列,其中 ORGUNIT_CD 定义如下:

[ORGUNIT_CD] [char](8) NOT NULL,

我在这里找到的值不是“1185”而是“00001185”。

Fact 表 'VF_Fact' 与表 L_ORG 相连,其中 ORGUNIT_CD 列定义如下:

[ORGUNIT_CD] [char](8) NOT NULL,

此表在 ORGUNIT_CD 列中具有以下值:'00001185'。

谁能解释一下,为什么会出现这个错误,以及如何消除它?

【问题讨论】:

  • 所涉及的任何表/视图中是否存在值 1185 的行?还是他们都只有00001185?

标签: sql-server ssas


【解决方案1】:

来自this answer

COALESCE:

返回类型

返回具有最高数据类型优先级的表达式的数据类型。如果所有表达式都不可为空,则输入结果 不可为空。

(强调添加)。 int 比 varchar 有一个 higher precedence,所以 COALESCE 的返回类型必须是 int 类型。显然, 您的 varchar 值无法如此转换。

正如另一个答案所述,ISNULL() 的行为不同:它不是返回具有最高优先级的数据类型,而是返回第一个值的数据类型(因此,@Aleem 的答案将解决您的问题)。更详细的解释可以在“表达式的数据类型”部分下找到here

在您的特定情况下,我实际上建议您将替代字符串括在单引号中,从而使 SQL Server 知道您打算将其作为字符字段。这意味着您的表达式将是以下之一:

CAST (ISNULL( emp.ORGUNIT_CD, '99999999' ) as char(8))
CAST (COALESCE( emp.ORGUNIT_CD, '99999999' ) AS char(8))

在这种情况下使用引号的好处?如果您(或其他开发人员)回到这一行并尝试将其更改为 COALESCE() 或进行任何其他类型的修改,它仍然可以在不破坏任何内容的情况下工作,因为您告诉 SQL Server 您想要什么数据类型在字符串本身中使用。根据您尝试执行的其他操作,您甚至可以完全删除 CAST() 语句。

COALESCE( emp.ORGUNIT_CD, '99999999' )

【讨论】:

    【解决方案2】:

    COALESCE 函数正在删除前导零。如果您正在检查空值,您可以这样做,它将保持零。 CAST (ISNULL( emp.ORGUNIT_CD, 99999999 ) as char(8))

    【讨论】:

      猜你喜欢
      • 2013-12-09
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      相关资源
      最近更新 更多