【问题标题】:Visual Studio Database Project - Unresolved Reference to temp tableVisual Studio 数据库项目 - 未解决的临时表引用
【发布时间】:2011-03-18 12:06:43
【问题描述】:

我已将我的 sql server 2005 数据库导入到 VS2010 数据库项目中。我的一个存储过程包含类似于

的语句

插入 #myTemp...

Visual Studio 给我一个警告,例如

SQL04151:过程:[dbo].[mySproc] 对对象 [#myTemp] 有一个未解析的引用。

有没有办法解决这个引用?我想尽可能多地清除项目警告。

【问题讨论】:

  • 临时表是在存储过程中创建的吗?
  • 不,在这种情况下,临时表是由“父”存储过程创建的,然后在循环中多次调用它:(

标签: sql-server-2005 visual-studio-2010 warnings reference


【解决方案1】:

我也有同样的事情,父母创造了它。如果它不存在,我不想通过创建表来消除警告,我希望能够在它不存在时抛出异常。在 return 语句之后放置一个 CREATE 语句可以保证它永远不会被运行,但也可以清除警告。

IF (OBJECT_ID('tempdb..#Foo') is null)
BEGIN
    Raiserror('#Foo doesn''t exist.', 16, 1)
    RETURN
    CREATE TABLE #Foo (foo int) --Here just to get rid of compile warning
END

【讨论】:

    【解决方案2】:

    您是否尝试过这里的三部分命名 (VS 2010 build database project receive SQL04151)

    此外,您可能需要将 db ref 更改为 tempdb 而不是 master。请参阅这篇文章 (http://blogs.msdn.com/b/gertd/archive/2009/06/10/system-objects-in-tempdb.aspx)。它描述了 sys 对象,但临时表存储在 tempdb 中,因此会表现出相同的行为。

    【讨论】:

      【解决方案3】:

      如果您知道自己的代码没有问题,则可以禁止生成警告。转到您的项目设置,您会找到一个名为 Build 的选项卡。那里有一个字段可以添加您希望禁止显示的代码。我用谷歌搜索并找到了this page,描述了这些步骤。

      【讨论】:

      • 我认为抑制所有 SQL04151 错误并不是一个好主意。当然你会摆脱临时表消息,但你也会抑制所有其他数据库引用警告......
      • 然后使用:#pragma warning disable 4151 /* SOME CODE */ #pragma warning restore 4151 请务必添加 cmets 以说明禁用警告的原因。
      【解决方案4】:

      很明显,VS 不知道这个存储过程只能从另一个创建这个临时表的存储过程中执行。一种解决方案是在必要时将代码添加到创建临时表的过程中

      If object_id('tempdb..#MyTemp') Is Null
          Create Table #MyTemp
              (
              ...
              )
      

      如果总是从父级调用,理论上上面的代码不应该运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-11
        • 2011-11-30
        • 1970-01-01
        • 2010-09-24
        • 2014-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多