我已经选择了类似以下内容的SQL:
IF EXISTS(SELECT name FROM tempdb..sysobjects WHERE name Like N'#tmp%'
and id=object_id('tempdb..#tmp'))
DROP TABLE #tmp
into #tmp
select * from permTable
我需要在继续处理之前向#tmp添加更多数据:
insert into #tmp
select * from permTable2
但是这会产生错误,因为SQL假设#tmp列的大小和类型(例如,如果permTable有一个列为int的列,但permTable2的列具有相同的名称但在一个记录中有一个NULL,则“无法插入值NULL”进入'IsPremium'列,表'tempdb.dbo。#tmp')。
如何让#tmp拥有我想要的类型?这真是不好的做法吗?
答案 0 :(得分:5)
您是否考虑过创建表格变量?您可以声明像
这样的列declare @sometable table(
SomeField [nvarchar](15),
SomeOtherField [decimal](15,2));
答案 1 :(得分:1)
这就是为什么select into对你的问题不是很好。使用create table命令专门创建表结构,然后编写两个insert语句。
答案 2 :(得分:0)
不可能。
如果您需要立即生成表定义类型列表, 从select语句创建一个视图,并从information_schema中读取列及其定义...(本文不考虑小数和/或datetime2)
注意:这将使您当前选择的varchar / varbinary列的字段长度最小。
您需要手动调整它们...
SELECT
','
+ COLUMN_NAME
+ ' '
+ DATA_TYPE
+ ' '
+ ISNULL
(
'('
+
CASE
WHEN CHARACTER_MAXIMUM_LENGTH = -1
THEN 'MAX'
ELSE CAST(CHARACTER_MAXIMUM_LENGTH AS varchar(36))
END
+ ')'
, ''
)
+ ' '
+ CASE WHEN IS_NULLABLE = 'NO' THEN 'NOT NULL' ELSE '' END
FROM information_schema.columns
WHERE table_name = '________theF'
ORDER BY ORDINAL_POSITION
插入语句的字段列表:
SELECT
',' + COLUMN_NAME
FROM information_schema.columns
WHERE table_name = '________theF'
ORDER BY ORDINAL_POSITION