首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复在CREATE语句中标记随机列的SSDT?

如何修复在CREATE语句中标记随机列的SSDT?
EN

Stack Overflow用户
提问于 2021-09-15 09:45:05
回答 2查看 118关注 0票数 0

我正在将一堆SQL Server数据库迁移到SSDT项目中,以便有源代码管理。有一个视图有非常多的列,使我无法构建其中一个项目。

项目结构:

代码语言:javascript
复制
Solution: ServerName
|- DB1
   |- Views
      |- View_that_doesn't_build
      |- View_source_1
|- DB2
   |- Views
      |- View_source_2
|- ...

在DB1中,我添加了DB2作为数据库引用,变量$(DB2)是“不同的数据库,相同的服务器”选项。

该视图如下所示:

代码语言:javascript
复制
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)

  • checked

  • 检查这些列是否实际存在于源代码视图之一

我甚至检查了语句是否运行在SSMS中,它确实运行。

如何修复此生成错误?这是因为列数众多吗?

编辑:我以前不太清楚,在对表进行混叠时,我还用表别名限定了所有列,同样的错误也发生了。

EN

回答 2

Stack Overflow用户

发布于 2021-09-15 10:12:15

错误告诉你这里的问题。由于您实际上没有给我们任何有意义的DDL,所以我不能“修复”您的视图,我只能用不同的场景演示问题,然后演示如何修复它。

以以下两个简单表格为例:

代码语言:javascript
复制
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

代码语言:javascript
复制
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知道从哪个表中获取值。

因此,要解决这个问题,请将列限定为您想要数据的对象的名称/别名。例如:

代码语言:javascript
复制
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;

这个错误现在消失了。

票数 2
EN

Stack Overflow用户

发布于 2021-09-16 10:30:15

SSDT不支持引用当前数据库中的对象的3个部件名称。使用两个部分的名称代替:dbo.View_source_1而不是[$(DatabaseName)].dbo.View_source_1

如果您出于某种原因需要3部分的名称,请为3部分的名称创建同义词,然后引用2部分的同义词。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69190679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档