找不到属性键 - MS SQL Server

时间:2015-04-14 14:54:43

标签: sql-server ssas

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

  

"表' VF_Fact',列ORGUNIT_CD,值:1185。属性是   ORGUNIT_CD。行被删除,因为找不到属性键。   属性:ORGUNIT_CD在维度'组织'来自数据库   ' Dashboard',Cube' Box Cube' ..."

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

事实表' VF_Fact'与表L_ORG连接,其中ORGUNIT_CD列定义如下:

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

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

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

2 个答案:

答案 0 :(得分:1)

COALESCE功能正在删除前导零。如果要检查空值,可以执行此操作,它将保留零。 CAST (ISNULL( emp.ORGUNIT_CD, 99999999 ) as char(8))

答案 1 :(得分:1)

来自this answer

  

COALESCE

     
    

返回类型

         

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

  
     

(强调补充)。 int有一个higher precedence而不是varchar,所以   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' )