未找到属性键 - MS SQL 服务器

attribute key was not found - MS SQL Server

我在 MS SQL 服务器上收到以下消息(我正在从德语翻译):

"Table 'VF_Fact', column ORGUNIT_CD, Value: 1185. The attribute is ORGUNIT_CD. Row was dropped because attribute key was not found. Attribute: ORGUNIT_CD in the dimension 'Organization' from database 'Dashboard', Cube 'Box Cube'..."

我检查了事实 table '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”。

事实 table 'VF_Fact' 与 table L_ORG 相关联,其中列 ORGUNIT_CD 定义如下:

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

此 table 在 ORGUNIT_CD 列中具有以下值:“00001185”。

任何人都可以解释一下,为什么我会收到此错误,以及如何删除它?

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

来自this answer

COALESCE:

Return Types

Returns the data type of expression with the highest data type precedence. If all expressions are nonnullable, the result is typed as nonnullable.

(强调)。 int 比 varchar 有 higher precedence,所以 您的 COALESCE 的 return 类型必须是 int 类型。显然, 您的 varchar 值不能这样转换。

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

在您的特定情况下,我实际上建议您将替代字符串用单引号引起来,从而使 SQL 服务器关闭您打算将其作为字符字段的事实。这意味着您的表达式将是以下之一:

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

在这种情况下使用引号的优势是什么?如果您(或其他开发人员)返回此行并尝试将其更改为 COALESCE() 或进行任何其他类型的修改,它仍然可以正常工作而不会破坏任何东西,因为您告诉 SQL服务器要在字符串本身中使用什么数据类型。根据您尝试执行的其他操作,您甚至可以完全删除 CAST() 语句。

COALESCE( emp.ORGUNIT_CD, '99999999' )