如何在投入值后将多行插入另一个表中的表

问题描述:

我有一个临时表#temp,其中包含要插入永久表(名为:Customer)的所有详细信息。
两个表的列名是相同的,但数据类型是不同的
(在#temp表中的所有列的数据类型为NVARCHAR,但在customer表列可能包含BIT, Date, INT ECT“),所以我需要之前投将其插入customer表。如何在投入值后将多行插入另一个表中的表

这需要是一个动态过程,因为我不知道列名或数据类型。

+0

您可以直接从温度导入。 Sql服务器会这样做,例如'123'在内部转换为123,除非直到找到像123x这样的数据。 – Azar 2014-09-12 10:32:20

+0

如果您不知道数据类型,您如何知道您的值将能够正确转换为目标数据类型? – 2014-09-12 13:21:59

这应该让你开始:

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表你的日期格式。