同一临时表上的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