Sql 如果列数据类型不同,如何将数据从一个表复制到另一个表?

Sql 如果列数据类型不同,如何将数据从一个表复制到另一个表?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有两张桌子 新建[包含数据][所有列均为varchar] NEW2[空表][列具有不同的数据类型] 我想将所有数据从New复制到New2 我所做的是 SELECT T.* INTO #tmp FROM (SELECT * FROM [dbo].[new]) AS T 然后 但它不起作用 Msg 242, Level 16, State 3, Line 2 The conversion of a varchar data type to a smalldat

我有两张桌子

  • 新建[包含数据][所有列均为varchar]

  • NEW2[空表][列具有不同的数据类型]

  • 我想将所有数据从New复制到New2

    我所做的是

    SELECT T.* 
    INTO   #tmp 
    FROM   (SELECT * 
            FROM   [dbo].[new]) AS T 
    
    然后

    但它不起作用

    Msg 242, Level 16, State 3, Line 2
    The conversion of a varchar data type to a smalldatetime data type resulted in an out-of-range value.
    The statement has been terminated.
    
    [我想要的是将新表的列数据类型,特别是varchar更改为smalldatetime。因此我尝试了这种方法。也欢迎使用任何其他方法。]

    任何帮助都将不胜感激


    谢谢。

    在插入时将您的专栏转换为
    smalldatetime

    SET DATEFORMAT ymd 
    INSERT INTO New2(col1, col2....)
    SELECT Col1,Col2 , CAST('2007-05-08 12:35:29'  AS smalldatetime) As Col_Name,...Col3
    FROM #TMP
    

    插入时将列强制转换为
    smalldatetime

    SET DATEFORMAT ymd 
    INSERT INTO New2(col1, col2....)
    SELECT Col1,Col2 , CAST('2007-05-08 12:35:29'  AS smalldatetime) As Col_Name,...Col3
    FROM #TMP
    
    试试看:

    DECLARE @NEW TABLE([date] VARCHAR(20));
    
    INSERT @NEW SELECT '2/8/2013 15:00' ;
    
    select LEFT([date],2) + SUBSTRING([date],3,2) + SUBSTRING([date],5,4) + ' '+ RIGHT([date],5)+':00'
    from @NEW 
    
    UPDATE @NEW SET [date] = CONVERT(CHAR(16), CONVERT(SMALLDATETIME, 
                             LEFT([date],2) + SUBSTRING([date],3,2) + SUBSTRING([date],5,4) + ' '+ RIGHT([date],5)+':00', 120));
    
    SELECT [date], CONVERT(SMALLDATETIME, [date]) FROM @NEW;
    
    试试看:

    DECLARE @NEW TABLE([date] VARCHAR(20));
    
    INSERT @NEW SELECT '2/8/2013 15:00' ;
    
    select LEFT([date],2) + SUBSTRING([date],3,2) + SUBSTRING([date],5,4) + ' '+ RIGHT([date],5)+':00'
    from @NEW 
    
    UPDATE @NEW SET [date] = CONVERT(CHAR(16), CONVERT(SMALLDATETIME, 
                             LEFT([date],2) + SUBSTRING([date],3,2) + SUBSTRING([date],5,4) + ' '+ RIGHT([date],5)+':00', 120));
    
    SELECT [date], CONVERT(SMALLDATETIME, [date]) FROM @NEW;
    
    对。完成了

    我所做的是, 已导入SQL Server表中的Excle数据,表中的所有列均为varchar数据类型。 问题出在excel数据中,日期值的某个地方是NA。所以我不得不用null替换所有的NA值

    为了检查表中的无效日期值,我使用了以下命令

    SELECT ISDATE(COL_NAME) AS Result
    
    SELECT ISNULL(COL_NAME) AS Result
    
    为此,有时还必须使用以下命令检查并设置SQL Server的日期格式:

    DBCC useroptions
    SET DATEFORMAT mdy
    
    然后我将所有结果值替换为NULL作为

    UPDATE TABLE SET COLUMN = NULL WHERE ISDATE(COLUMN) = 0 OR COLUMN = 'NA'
    
    最后,我使用简单的alter命令手动更新了所需的列,如下所示:

    ALTER TABLE ALTER COLUMN COL_NAME <<data type>>
    
    ALTER TABLE ALTER COL\u NAME
    
    我还将dateforamat更改为dmy,之前是mdy

    感谢苏拉吉·辛格和迪普什卡提出的有益建议。

    是的。完成了

    我所做的是, 已导入SQL Server表中的Excle数据,表中的所有列均为varchar数据类型。 问题出在excel数据中,日期值的某个地方是NA。所以我不得不用null替换所有的NA值

    为了检查表中的无效日期值,我使用了以下命令

    SELECT ISDATE(COL_NAME) AS Result
    
    SELECT ISNULL(COL_NAME) AS Result
    
    为此,有时还必须使用以下命令检查并设置SQL Server的日期格式:

    DBCC useroptions
    SET DATEFORMAT mdy
    
    然后我将所有结果值替换为NULL作为

    UPDATE TABLE SET COLUMN = NULL WHERE ISDATE(COLUMN) = 0 OR COLUMN = 'NA'
    
    最后,我使用简单的alter命令手动更新了所需的列,如下所示:

    ALTER TABLE ALTER COLUMN COL_NAME <<data type>>
    
    ALTER TABLE ALTER COL\u NAME
    
    我还将dateforamat更改为dmy,之前是mdy

    感谢苏拉吉·辛格和迪普什卡提出的有益建议。

    试试这个

    SET DATEFORMAT ymd 
    INSERT INTO destination_table(column_name)
    SELECT Column_name As Aliace_name
    FROM Source_table
    
    试试这个

    SET DATEFORMAT ymd 
    INSERT INTO destination_table(column_name)
    SELECT Column_name As Aliace_name
    FROM Source_table
    


    从表
    #TMP
    中选择数据时,需要使用表
    new2
    的相应数据类型转换数据。。在sql server数据库中,您可以对相同的任务使用
    convert
    函数,但该表有很多列。我的目的是只转换直接不可能的列数据类型。查询太长,无法将CONVERT()应用于每一列。还有什么想法吗。感谢您的快速回复。建议在表中有大量列列表,这就是为什么我们过去在大型数据库中应用规范化概念,以便以适当的方式维护我们的数据。。但对于这个问题,据我所知,您需要编写那个庞大的查询以插入到另一个表中。。因此,您可以更改任一表中的数据类型以使其同步,这将是更好的方法。是的,Pratik,我同意,但我在新表中加载的数据是从Excel文件导入的。因此,避免复杂性,所有列都设置为varchar。问题只在于日期列。我尝试使用CAST([AlarmTime]作为smalldatetime)但它不起作用。从表
    #TMP
    中选择数据时,需要使用表
    new2
    的相应数据类型转换数据。。在sql server数据库中,您可以对相同的任务使用
    convert
    函数,但该表有很多列。我的目的是只转换直接不可能的列数据类型。查询太长,无法将CONVERT()应用于每一列。还有什么想法吗。感谢您的快速回复。建议在表中有大量列列表,这就是为什么我们过去在大型数据库中应用规范化概念,以便以适当的方式维护我们的数据。。但对于这个问题,据我所知,您需要编写那个庞大的查询以插入到另一个表中。。因此,您可以更改任一表中的数据类型以使其同步,这将是更好的方法。是的,Pratik,我同意,但我在新表中加载的数据是从Excel文件导入的。因此,避免复杂性,所有列都设置为varchar。问题只在于日期列。我尝试使用CAST([AlarmTime]作为smalldatetime),但它不起作用。同样的错误不起作用。我试过使用CAST([col_name]AS smalldatetime)@Aditya您的新表需要什么数据类型?还要检查您的列值是否有效,是否可以转换为
    smalldatetime
    嘿,对不起,实际的错误是,[将varchar数据类型转换为smalldatetime数据类型导致值超出范围。]。当我使用sql='select cast(col作为smalldatetime)from#tmp'时,我所做的是,sql='INSERT INTO New2([col])选择cast(col作为smalldatetime)作为col from#tmp'。但引发了相同的错误。即使是我也无法从#tmp中选择sql='select CAST(col as smalldatetime)'错误=将字符串转换为smalldatetime数据类型时转换失败。相同的错误不起作用。我试过使用CAST([col_name]AS smalldatetime)@Aditya您的新表需要什么数据类型?还要检查您的列值是否有效,是否可以转换为
    smalldatetime
    嘿,对不起,实际的错误是,[将varchar数据类型转换为smalldatetime数据类型导致值超出范围。]。当我使用sql='select cast(col作为smalldatetime)from#tmp'时,我所做的是,sql='INSERT INTO New2([col])选择cast(col作为smalldatetime)作为col from#tmp'。但是抛出了同样的错误。即使我也不能从#tmp’error=conv中选择sql='selectcast(colassmalldatetime)