我正在尝试根据SQL 2005中条件的结果填充临时表。两种方法中的临时表都具有相同的结构,但是将根据条件使用不同的查询进行填充。下面的简化示例脚本未能对ELSE块INSERT INTO进行语法检查,并出现以下错误:
ELSE
INSERT INTO
数据库中已经有一个名为“ #MyTestTable”的对象。
DECLARE @Id int SET @Id = 1 IF OBJECT_ID('tempdb..#MyTestTable') IS NOT NULL DROP TABLE #MyTestTable IF (@Id = 2) BEGIN SELECT 'ABC' AS Letters INTO #MyTestTable; END ELSE BEGIN SELECT 'XYZ' AS Letters INTO #MyTestTable; END
我可以在IF/ELSE语句之前创建临时表,然后只INSERT SELECT在条件块中执行语句,但是该表将包含很多列,并且我试图提高效率。那是唯一的选择吗?还是有某种方法可以使这项工作?
IF/ELSE
INSERT SELECT
谢谢,马特
您遇到的问题不是您正在填充临时表,而是试图 创建 表。SQL解析您的脚本,发现您试图在两个不同的地方创建它,因此引发了错误。认识到“执行路径”可能无法同时击中两个创建状态时,还不够聪明。使用动态SQL是行不通的。我试过了
DECLARE @Command varchar(500) DECLARE @Id int SET @Id = 2 IF OBJECT_ID('tempdb..#MyTestTable') IS NOT NULL DROP TABLE #MyTestTable IF (@Id = 2) BEGIN SET @Command = 'SELECT ''ABC'' AS Letters INTO #MyTestTable' END ELSE BEGIN SET @Command = 'SELECT ''XYZ'' AS Letters INTO #MyTestTable' END EXECUTE (@Command) select * from #MyTestTable
但是临时表只持续与动态会话一样长的时间。所以,a,您似乎必须先声明该表,然后填充它。可能难以编写和支持的代码,但是它会足够有效地执行。