2014-09-12 140 views
0

我有一個臨時表#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

回答

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

相關問題