Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual Studio在加入临时表时未在SQL Server数据库项目中报告错误71501_Sql_Sql Server_Tsql_Visual Studio 2019_Sqlproj - Fatal编程技术网

Visual Studio在加入临时表时未在SQL Server数据库项目中报告错误71501

Visual Studio在加入临时表时未在SQL Server数据库项目中报告错误71501,sql,sql-server,tsql,visual-studio-2019,sqlproj,Sql,Sql Server,Tsql,Visual Studio 2019,Sqlproj,我试图弄明白为什么VisualStudio在加入临时表时不报告错误SQL71501(对对象的未解析引用) 我使用的是VS 2019版本16.3.6,通过创建新的SQL Server数据库项目、添加新表和存储过程,可以重现该问题: CREATE TABLE [dbo].[Table1] ( [Id] INT NOT NULL PRIMARY KEY ) CREATE PROCEDURE [dbo].[Procedure1] AS SELECT t1.[Id2] -- Causes

我试图弄明白为什么VisualStudio在加入临时表时不报告错误SQL71501(对对象的未解析引用)

我使用的是VS 2019版本16.3.6,通过创建新的SQL Server数据库项目、添加新表和存储过程,可以重现该问题:

CREATE TABLE [dbo].[Table1]
(
    [Id] INT NOT NULL PRIMARY KEY
)

CREATE PROCEDURE [dbo].[Procedure1]
AS
    SELECT t1.[Id2] -- Causes error
    FROM [dbo].[Table1] t1
RETURN

CREATE PROCEDURE [dbo].[Procedure2]
AS
    CREATE TABLE #test ([Id] int)

    SELECT t1.[Id2] -- No error and project builds
    FROM [dbo].[Table1] t1
    JOIN #test t2 on t1.[Id]=t2.[Id]
RETURN

我们需要重构一个大型数据库,这隐藏了删除/重命名数据库对象时应该发生的许多错误。有没有办法解决这个问题?

这不是VS问题,使用SSMS
[Procedure2]
创建时也没有错误。有一场争吵。不会更改此sql server行为。@Serg:VS错误消息与sql server行为不同。具体来说,创建一个引用不存在的表的存储过程是完全合法的,它依赖于延迟编译(正如人们讨厌这个“特性”),因此创建
Procedure1
将被接受,甚至没有警告。在数据库项目中,缺少引用确实会产生警告。如果表根本不存在,VS将针对这两个过程发出SQL71502警告,其中包含对
[dbo].[Table1]
的未解析引用。如果表在那里,但列不在那里,则仅对
Procedure1
触发SQL71501。当涉及到临时表时,分析器似乎犯了一个谨慎的错误,它完全关闭了列引用的验证,而不仅仅是针对所讨论的临时表。无论采用哪种方式,这种行为都是不一致的——它比SQL Server本身有更严格的检查,除非它没有检查。@Jeroenmoster,我的观点是,对于
[Procedure2]
的过程OP中的临时表,无法获得编译时错误。这是sql server功能,而不是VS或SSMS功能。它在程序代码中看起来不太深,无法检测到缺少的临时表列。@Serg:SQL Server不会检查任何内容(临时表或否),但Visual Studio数据库项目中包含的分析器会检查。当生成这些消息时,SQL Server实际上甚至没有运行。这里的问题不是它忽略了临时表(这可能是可以原谅的),而是它甚至忽略了非临时表的不正确列引用,只是因为查询中涉及了临时表。这既不符合SQL Server编译存储过程的方式,也不符合其自身更广泛的分析。