同一查询在视图内会带来不同的结果。
我尝试强制使用相同的代码页、相同的数据类型、通用查询表达式...但没有成功。
看看这个简单的查询:
SELECT TOP 100 CompanyID, SubsidiaryID
FROM STAGING.SALESAX S
INNER JOIN Subsidiary SU
ON S.CompanyID = SU.SubsidiaryAXCode
它返回所有预期的 100 行。
如果我在视图中使用
EXACT SAME QUERY
:
CREATE VIEW [STAGING].[VSalesAXBASE]
AS
SELECT TOP 100 CompanyID, SubsidiaryID
FROM STAGING.SALESAX S
INNER JOIN Subsidiary SU
ON S.CompanyID = SU.SubsidiaryAXCode
GO
SELECT * FROM [STAGING].[VSalesAXBASE]
它返回 0 ROWS
您可以在
SALESAX
表前添加 STAGING.
,但不要在查询中为 Subsidiary
表添加前缀。为查询中的所有表添加前缀。
一种可能性是存在多个
Subsidiary
表,并且查询在视图上下文中使用不同的表。
顺便说一句,在查询的
SELECT
部分中为列添加表名前缀也是一个好习惯。例如,现在很难知道列 CompanyID
和 SubsidiaryID
来自哪个表。
如果您有一个使用特定架构的视图,并且它引用了使用默认架构的表,那么您需要检查视图架构中是否存在重复的表名,其中包含不同的数据。 所以查看test.foo是
create view test.foo as
(
select col1 from bar
)
go
如果您只是单独运行查询,它将使用默认架构(通常
dbo
)。 但是,如果还有一个现有的 test.bar
表,那么它将使用该表,因为视图正在该上下文中运行。
-- this will give different results if dbo.bar and test.bar have different data
select * from test.foo
视图需要如下以确保引用正确的表。
create view test.foo as
(
select col1 from test.bar
)
go
除非使用显式的 Order By 子句,否则 SQL 不保证结果的排序。