我在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'。
任何人都可以解释一下,为什么我会收到此错误,以及如何将其删除?
答案 0 :(得分:1)
COALESCE功能正在删除前导零。如果要检查空值,可以执行此操作,它将保留零。
CAST (ISNULL( emp.ORGUNIT_CD, 99999999 ) as char(8))
答案 1 :(得分:1)
来自this answer:
返回类型
返回最高数据类型优先级的表达式的数据类型。如果所有表达式都不可为空,则键入结果 作为不可侵犯的。
(强调补充)。 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' )