未找到属性键 - 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:
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' )
我在 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:
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' )