Sql server 未找到属性键-MS SQL Server

Sql server 未找到属性键-MS SQL Server,sql-server,ssas,Sql Server,Ssas,我在MS SQL Server上收到以下消息(我从德语翻译): “表'VF_Fact',ORGUNIT_CD列,值:1185。属性为” ORGUNIT_CD.行已删除,因为未找到属性键。 属性:数据库中维度“组织”中的ORGUNIT\u CD “仪表板”,多维数据集“长方体”…” 我检查了事实表'VF_fact'和列ORGUNIT_CD-在那里我找到了值'1185'。列ORGUNIT_CD在视图中定义如下: CAST( COALESCE( emp.ORGUNIT_CD, 99999999 )

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

“表'VF_Fact',ORGUNIT_CD列,值:1185。属性为” ORGUNIT_CD.行已删除,因为未找到属性键。 属性:数据库中维度“组织”中的ORGUNIT\u CD “仪表板”,多维数据集“长方体”…”

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

CAST(  COALESCE( emp.ORGUNIT_CD, 99999999 ) AS char(8)) AS ORGUNIT_CD,
此外,该视图从L_Employee_SAP表中检索该列,其中ORGUNIT_CD的定义如下:

[ORGUNIT_CD] [char](8) NOT NULL,
我在这里找到的值不是'1185',而是'00001185'

事实表“VF\U Fact”与表L\U ORG相连,其中ORGUNIT\U CD列定义如下:

[ORGUNIT_CD] [char](8) NOT NULL,
此表在ORGUNIT_CD列中具有以下值:“00001185”


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

合并函数正在删除前导零。如果您正在检查空值,您可以这样做,它将保留零。
将(ISNULL(emp.ORGUNIT_CD,99999999)转换为字符(8))
来自:

:

返回类型

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

(重点补充)。int的值比varchar的值大,所以
COALESCE
的返回类型必须是int类型。显然, 您的varchar值不能这样转换

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

在您的特定情况下,我实际上建议您将可选字符串用单引号括起来,从而使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' )

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