我已经接到了排除故障的观点。它以CTE开头,该CTE获取在每个查询之间使用UNION的多个表中使用的代理键的所有值。然后,它使用此CTE作为INNER JOIN来选择有关这些代理键的数据。查询类似于以下代码:
WITH emp AS (
SELECT DISTINCT EmployeeSk FROM view1
UNION
SELECT DISTINCT EmployeeSK FROM Table1
UNION
--then there are two views that if you include BOTH, the overall query fails
SELECT DISTINCT EmployeeSK FROM view2
UNION
SELECT DISTINCT EmployeeSK FROM View3 )
SELECT Col1, col2, col3
FROM Table2 t2
INNER JOIN emp
ON t2.EmployeeSK = emp.EmployeeSK
每当您使用CTE时,用户都会收到错误:
Msg 241, Level 16, State 1, Line 22
Conversion failed when converting date and/or time from character string.
如果单独选择每个查询,则所有查询都返回INT。实际上,我通过对每个源运行以下查询来仔细检查每个查询:
SELECT DISTINCT SQL_VARIANT_PROPERTY(<tableSK>, 'BaseType') FROM <source Table or view>
所有查询都报告返回的所有列都是INT。
我还创建了一个#tempTable:
CREATE TABLE #tmp ( SurrogateKey INT)
然后将每个查询插入#tempTable并且所有插入都有效。所有值均为INT。值范围为-1到16435。
只要我返回两个查询中的一个,我就可以获得与UNION一起使用的所有查询。如果我删除这些查询之一,CTE和UNION语句将起作用,但我不能同时使用它们。这两个查询的值也是INT,并且值也在-1到16435之间。
我不知道为什么会收到此错误。除了将视图重写为存储过程,并将值放入临时表之外,我还能尝试什么?