我正在将一堆SQL Server数据库迁移到SSDT项目中,以便有源代码管理。有一个视图有非常多的列,使我无法构建其中一个项目。
项目结构:
Solution: ServerName
|- DB1
|- Views
|- View_that_doesn't_build
|- View_source_1
|- DB2
|- Views
|- View_source_2
|- ...在DB1中,我添加了DB2作为数据库引用,变量$(DB2)是“不同的数据库,相同的服务器”选项。
该视图如下所示:
CREATE VIEW "View_that_doesn't_build" -- don't worry, it's actually a valid sysname, renamed for the sake of question clarity
AS
SELECT
-- 143 columns, some computed, some normal
FROM
[$(DatabaseName)].dbo.View_source_1
INNER JOIN
[$(DB2)].dbo.View_source_2
ON View_source_1.code = View_source_2.code生成后,大多数列不报告任何错误,但在其中一些列(通常是最后一个X列)上,出现了以下错误:
SQL71561: Computed列:dbo.view_that_that_build.ome_SQL71561包含对对象的未解析引用。对象不存在,或者引用不明确,因为它可以引用以下任何一个对象:$(DB2)、.dbo.View_source_2.Some_column或dbo.View_source_1.Some_column。
问题是,Some_column并不存在于两个源视图中,因为除了“代码”(它不会给出这样的错误)之外,每个列名在两个源视图中都是唯一的。
到目前为止我尝试过的是:
change)
我甚至检查了语句是否运行在SSMS中,它确实运行。
如何修复此生成错误?这是因为列数众多吗?
编辑:我以前不太清楚,在对表进行混叠时,我还用表别名限定了所有列,同样的错误也发生了。
发布于 2021-09-15 10:12:15
错误告诉你这里的问题。由于您实际上没有给我们任何有意义的DDL,所以我不能“修复”您的视图,我只能用不同的场景演示问题,然后演示如何修复它。
以以下两个简单表格为例:
CREATE TABLE dbo.Table1 (ID int IDENTITY,
SomeColumn varchar(20),
AnotherColumn date);
GO
CREATE TABLE dbo.Table2 (ID int IDENTITY,
T1ID int,
MyColumn varchar(20),
AnotherColumn datetime2(0));
GO现在是下面的VIEW
CREATE VIEW dbo.MyView AS
SELECT T1.ID, --Intentionally qualified
T1.SomeColumn,
T2.MyColumn,
AnotherColumn --Missing Qualification
FROM dbo.Table1 T1
JOIN dbo.Table2 T2 ON T1.ID = T2.T1ID;当您尝试创建此VIEW时,会得到以下错误:
模棱两可的列名'AnotherColumn‘。
这是因为AnotherColumn同时出现在Table1 和Table2中;因此Server不知道您指的是哪一列。但是,请注意,对于ID没有任何抱怨,因为它具有表的别名T1,因此Server知道从哪个表中获取值。
因此,要解决这个问题,请将列限定为您想要数据的对象的名称/别名。例如:
CREATE VIEW dbo.MyView AS
SELECT T1.ID, --Intentionally qualified
T1.SomeColumn,
T2.MyColumn,
T2.AnotherColumn --Qualified
FROM dbo.Table1 T1
JOIN dbo.Table2 T2 ON T1.ID = T2.T1ID;这个错误现在消失了。
发布于 2021-09-16 10:30:15
SSDT不支持引用当前数据库中的对象的3个部件名称。使用两个部分的名称代替:dbo.View_source_1而不是[$(DatabaseName)].dbo.View_source_1。
如果您出于某种原因需要3部分的名称,请为3部分的名称创建同义词,然后引用2部分的同义词。
https://stackoverflow.com/questions/69190679
复制相似问题