SQL Server 2012中使用T-SQL将查询结果插入临时表的问题
解决SQL Server临时表创建与插入的语法问题
嘿,我来帮你排查下代码里的问题~你的代码主要有两个关键问题导致语法错误:
- 创建临时表时没有定义列结构:SQL Server不知道
#temptable应该包含哪些列,插入数据时自然会报错。 - 不必要的
GO分隔符:它会把语句拆成独立批处理,虽然本地临时表在会话内有效,但这里用GO完全没必要,反而容易造成逻辑脱节。
下面给你两种可行的解决方案,按需选择:
方法一:先定义临时表结构,再插入数据
这种方式适合你明确知道列类型的场景,能更精准地控制临时表的结构:
USE MyDatabase; -- 先创建匹配原表列结构的临时表,注意列类型要和MYLIST中的对应列一致 CREATE TABLE #temptable ( [Col A] VARCHAR(100), -- 替换成实际的列类型,比如INT/DATETIME等 [Col B] INT, [Col C] DATE ); -- 向临时表插入筛选后的数据 INSERT INTO #temptable ([Col A], [Col B], [Col C]) SELECT [Col A], [Col B], [Col C] FROM MYLIST WHERE [MONTH OF STAY] = '2018-03-01' AND [Property] = 'ABC'; -- 查询临时表数据 SELECT * FROM #temptable;
方法二:用SELECT INTO一键创建并插入(更简洁)
如果你不想手动定义列结构,这种方式会让SQL Server自动根据查询结果生成临时表的列,非常高效:
USE MyDatabase; -- 直接通过SELECT语句创建临时表并插入数据 SELECT [Col A], [Col B], [Col C] INTO #temptable FROM MYLIST WHERE [MONTH OF STAY] = '2018-03-01' AND [Property] = 'ABC'; -- 查询临时表数据 SELECT * FROM #temptable;
小提示
- 本地临时表(以
#开头)仅在当前查询会话中存在,关闭窗口后会自动被SQL Server删除;如果需要跨会话共享,可改用全局临时表(以##开头)。 - 确保
[MONTH OF STAY]列的类型和你传入的'2018-03-01'匹配,如果是日期类型,这个写法没问题;如果是字符串类型,要确认原表中的格式一致。
内容的提问来源于stack exchange,提问作者user3115933
相关产品推荐
相关产品推荐

