Tsql 如何告诉SQL Server不要在[sub]过程中警告临时表的使用情况?

Tsql 如何告诉SQL Server不要在[sub]过程中警告临时表的使用情况?,tsql,sql-server-2012,Tsql,Sql Server 2012,我拥有的是一个存储过程(a),它创建一个临时表(T)并调用另一个过程(B)B插入到T,但由于它是在A中创建的,因此生成警告我T在B中未知。如果代码对您更有意义,那么它就是: BEGIN TRAN GO CREATE PROCEDURE dbo.B AS BEGIN INSERT INTO #T VALUES (1) INSERT INTO #T VALUES (0) INSERT INTO #T VALUES (1) END GO CREATE PROCEDURE db

我拥有的是一个存储过程(a),它创建一个临时表(T)并调用另一个过程(BB插入到T,但由于它是在A中创建的,因此生成警告我TB中未知。如果代码对您更有意义,那么它就是:

BEGIN TRAN
GO

CREATE PROCEDURE dbo.B
AS
BEGIN
    INSERT INTO #T VALUES (1)
    INSERT INTO #T VALUES (0)
    INSERT INTO #T VALUES (1)
END
GO
CREATE PROCEDURE dbo.A
AS
BEGIN
    CREATE TABLE #T
    (
        Dummy BIT
    )
    EXEC dbo.B
    SELECT * from #T
END
GO
EXEC dbo.A

ROLLBACK
有没有一种方法可以让VisualStudio不向我发出警告?我希望有像ReSharper这样的评论可以告诉它忽略这个问题


我知道另一种选择是添加
,如果不存在,则创建T
脚本,但如果可能的话,我希望避免这种情况。

尝试在以下内容中进行转换

IF 1 = 0
CREATE TABLE #T (Dummy BIT)

我建议更改程序B以返回记录。然后使用
EXEC。。。像这样插入
语句:

BEGIN TRAN
GO

CREATE PROCEDURE dbo.B
AS
BEGIN
    Select 1
    Union All Select 0
    Union All Select 1
END
GO
CREATE PROCEDURE dbo.A
AS
BEGIN
    CREATE TABLE #T
    (
        Dummy BIT
    )
    EXEC dbo.B
    INSERT #T

    SELECT * from #T
END
GO
EXEC dbo.A

ROLLBACK
一些想法:

用实际代码替换对B的调用。换句话说,不是

 exec dbo.B
使用B的实际代码:

INSERT INTO #T VALUES (1)
INSERT INTO #T VALUES (0)
INSERT INTO #T VALUES (1)
  • 在B中,可以用动态SQL替换使用#T的代码。编译B时不会发出警告

  • 您可以将T转换为永久表

  • 否则,不,我认为没有办法关闭这个警告。然而,这个警告是无害的


    请注意,如果使用表值参数,则不会收到此警告,但由于这些参数必须声明为只读,因此我假设这不是在B中使用的选项。

    这不是SQL Server警告-这是Visual Studio警告。感谢@Damien_的反对者。我认为这实际上是SSDT警告。它在Management Studio中显示,在Visual Studio构建中显示警告。这将起作用,但我绝不同意仅为了避免编译器错误而将
    IF 1=0
    放入程序中。