同一临时表上的T-SQL If-Else条件

同一临时表上的T-SQL If-Else条件,sql,sql-server,tsql,Sql,Sql Server,Tsql,以下是我试图做的: IF len(Variable) > 1 BEGIN SELECT * INTO #TEMPTAB FROM multiple joins END ELSE BEGIN SELECT * INTO #TEMPTAB FROM different multiple joins END SELECT * FROM #TEMPTAB more large number of multiple joins & where & groupby ER

以下是我试图做的:

IF len(Variable) > 1
BEGIN
   SELECT * INTO #TEMPTAB FROM multiple joins
END
ELSE
BEGIN
  SELECT * INTO #TEMPTAB FROM different multiple joins
END

SELECT * FROM #TEMPTAB more large number of multiple joins & where & groupby

 ERROR: There is already an object #TEMPTAB defined 
 -- Because of select * into in IF and ELSE both
我不想创建临时表,因为它有很多列需要定义。
有办法解决吗?

第一次运行此代码时,它创建了表#testab。下一次运行SQL Server时,会告诉您该表已经存在。您应该在代码前面加上以下内容:

if object_ID('tempdb..#TEMPTAB','U') is not null
   drop table #TEMPTAB

这将删除(如果表已经存在,则删除它),随后的代码将始终能够重新创建(或创建)表。

这对我来说是一个有趣的问题,即。。。我想出了四种方法。一个是视图,一个是临时表,一个是物理表,一个是存储过程和全局临时表。如果你有任何问题,请告诉我

看法 临时表 具有全局临时表的存储过程
<>你没有考虑过全局临时表的动态查询吗?这对我很有用:

DECLARE @sql NVARCHAR(MAX) = CASE WHEN 1 = 2
                                  THEN 'SELECT * INTO ##TEMPTAB FROM dbo.SomeTable1'
                                  ELSE 'SELECT * INTO ##TEMPTAB FROM dbo.SomeTable2'
                             END
EXEC (@sql) 

SELECT  * FROM ##TEMPTAB
DROP TABLE ##TEMPTAB

这可能会有帮助:懒惰是有代价的:)基本上:你不能只使用
#entitab1
#entitab2
并将select移到if else子句中,并在相应的表上执行它吗?@jpw然后我将不得不复制大约1K行的代码。实际上,这不会起作用,因为问题与SQL Server的工作方式有关解析查询时解析对象名称。请查看遇到的错误语句。如果HAPP在第一次运行时将代码复制到另一个窗口(或者可能产生另一个错误)。第二次运行时,在同一个窗口中,它将产生列出的错误。不,它不会工作。人们可以认为它应该,但它不会。试试这里的代码,你自己看看:我错了。SQL Server假定在这之后,if的第一部分将创建表,第二部分可以执行(else),并且表将已经存在。解析器不够聪明,无法意识到只能执行一个代码路径(因为它无法在运行前评估条件)。我猜没有干净的方法来完成任务!我将无法使用您的物理表或视图解决方案,您的临时表解决方案再次给我带来了同样的问题,我将不得不为我的表指定所有列(这是一个很大的问题)。谢谢你的解决方案!是的,没有干净的解决办法。顺便说一句,临时表解决方案不需要定义列,但临时表需要兼容。您可以使用select into,然后通过将其脚本化为CREATETABLE语句来获取表定义。不应该有太多的工作。
DECLARE @Variable VARCHAR(100) = 'aa',
        --Default value is 0
        @percent INT = 0;

--If the length > 1, then change percent to 100 as to return the whole table
IF LEN(@Variable) > 1
    SET @percent = 100;

--If the length <=1, then @percent stays 0 and you return 0 percent of the table
SELECT TOP(@percent) PERCENT 'Greater than 1' col INTO #TEMPTAB

--If you didn't populate the table with rows, then use this query to populate it
IF(@percent = 0)
BEGIN
    INSERT INTO #TEMPTAB
    SELECT 'Less than 1' col
END

/*your 1k lines of code here*/
SELECT *
FROM #TEMPTAB

--Cleanup
DROP TABLE #tempTab
DECLARE @Variable VARCHAR(10) = 'A';

IF len(@Variable) > 1
BEGIN
   SELECT 'Greater than 1' col INTO TEMPTAB 
END
ELSE
BEGIN
    SELECT 'Less than 1' col INTO TEMPTAB2
END

IF OBJECT_ID('TEMPTAB2') IS NOT NULL
    --SP_Rename doesn't work on temp tables so that's why it's an actual table
    EXEC SP_RENAME 'TEMPTAB2','TEMPTAB','Object'

SELECT *
FROM TEMPTAB

DROP TABLE TEMPTAB;
IF OBJECT_ID('yourProcedure') IS NOT NULL
        DROP PROCEDURE yourProcedure;
GO
CREATE PROCEDURE yourProcedure
AS
    IF OBJECT_ID('tempdb..##TEMPTAB') IS NOT NULL
        DROP TABLE ##tempTab;
    SELECT 'Greater than 1' col INTO ##TEMPTAB
GO

DECLARE @Variable VARCHAR(10) = 'aaa';

IF LEN(@Variable) > 1
    BEGIN
        EXEC yourProcedure; 
    END
ELSE
    BEGIN
        SELECT 'Less than 1' col INTO ##TEMPTAB
    END

SELECT *
FROM ##TEMPTAB

IF OBJECT_ID('tempdb..##TEMPTAB') IS NOT NULL
        DROP TABLE ##TEMPTab;
DECLARE @sql NVARCHAR(MAX) = CASE WHEN 1 = 2
                                  THEN 'SELECT * INTO ##TEMPTAB FROM dbo.SomeTable1'
                                  ELSE 'SELECT * INTO ##TEMPTAB FROM dbo.SomeTable2'
                             END
EXEC (@sql) 

SELECT  * FROM ##TEMPTAB
DROP TABLE ##TEMPTAB