如何在投入值后将多行插入另一个表中的表
问题描述:
我有一个临时表#temp
,其中包含要插入永久表(名为:Customer
)的所有详细信息。
两个表的列名是相同的,但数据类型是不同的
(在#temp
表中的所有列的数据类型为NVARCHAR
,但在customer
表列可能包含BIT, Date, INT
ECT“),所以我需要之前投将其插入customer
表。如何在投入值后将多行插入另一个表中的表
这需要是一个动态过程,因为我不知道列名或数据类型。
答
这应该让你开始:
DECLARE @TargetTableName sysname = 'Customer',
@SourceTableName sysname = '#temp'
-- start the dynamic sql
DECLARE @Sql nvarchar(max) = 'INSERT INTO '+ @TargetTableName +' ('
-- get the columns list
SELECT @Sql = @Sql + COLUMN_NAME +', '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TargetTableName
-- remove the last ', ' and add ') SELECT'
SET @Sql = LEFT(@Sql, LEN(@sql)-2) +') SELECT '
-- Select the column names and types to create
-- CAST(ColumnName As DataType[(Length)]) for each column
SELECT @Sql = @Sql + 'CAST('+ COLUMN_NAME +' As '+ DATA_TYPE +
CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN
'(max)'
WHEN CHARACTER_MAXIMUM_LENGTH IS NOT NULL THEN
'('+ CAST(CHARACTER_MAXIMUM_LENGTH as varchar(10)) +')'
ELSE
''
END +'), '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TargetTableName
-- remove the last comma and add the FROM clause
SET @Sql = LEFT(@Sql, LEN(@sql)-1) + ' FROM '+ @SourceTableName
SELECT @Sql -- this, of course, should be EXEC @Sql, but I recommend leaving it as SELECT or PRINT until you get the exact sql you need.
注意:日期栏,你应该考虑使用CONVERT代替CAST,特别是如果你知道在#temp表你的日期格式。
您可以直接从温度导入。 Sql服务器会这样做,例如'123'在内部转换为123,除非直到找到像123x这样的数据。 – Azar 2014-09-12 10:32:20
如果您不知道数据类型,您如何知道您的值将能够正确转换为目标数据类型? – 2014-09-12 13:21:59