【问题标题】:How insert multiple row into a table from another table after casting the value转换值后如何将多行从另一个表插入到一个表中
【发布时间】:2014-09-12 10:28:39
【问题描述】:

我有一个临时表 #temp,其中包含要插入到永久表中的所有详细信息(名为:Customer)。
两个表的列名相同,但数据类型不同
(在#temp 表中所有列的数据类型是NVARCHAR,但在customer 表中的列可能包含BIT, Date, INT 等)所以我需要在插入customer 表之前对其进行转换。

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

【问题讨论】:

  • 可以直接从 temp 导入。 Sql server 将执行此操作,例如 '123' 在内部转换为 123,除非它找到像 123x 这样的数据。
  • 如果您不知道数据类型,如何知道您的值能够正确转换为目标数据类型?

标签: sql sql-server casting bulkinsert sql-types


【解决方案1】:

这应该让你开始:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 2018-11-25
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多