如何将数据从一个表复制到另一个列数据类型不同的表?
Posted
技术标签:
【中文标题】如何将数据从一个表复制到另一个列数据类型不同的表?【英文标题】:How to copy data from one table to another where column data types are different? 【发布时间】:2013-12-06 07:39:38 【问题描述】:我有两张桌子。
新 [包含数据] [所有列都是 varchar]
NEW2 [空表] [列属于不同的数据类型]
我想将所有数据从 New 复制到 New2。
我所做的是,
SELECT T.*
INTO #tmp
FROM (SELECT *
FROM [dbo].[new]) AS T
然后
INSERT INTO New2(col1, col2....)
SELECT *
FROM #TMP
但它不起作用。
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.
[我想要的是将NEW表的列数据类型,特别是varchar更改为smalldatetime。所以我尝试了这种方式。也欢迎任何其他方法。]
任何帮助将不胜感激。
谢谢。
【问题讨论】:
在从表#TMP
中选择数据时,您需要将数据转换为表new2
的相应数据类型。在sql-server数据库中,您可以使用convert
函数完成相同的任务
但是表格有很多列。我的目的是只转换直接不可能的列数据类型。该查询将太长而无法将 CONVERT() 应用于每一列。所以还有什么想法。感谢您的快速回复。
建议在表中使用非常多的列列表,这就是为什么我们曾经在大型数据库上应用规范化概念来以适当的方式维护我们的数据。但是据我所知,对于这个问题,你需要编写那个庞大的查询来插入另一个表。
根据建议,您应该为相同类型的列使用相同的数据类型。所以您可以更改任一表中的数据类型以使其同步,这将是更好的方法..
是的,Pratik,我同意,但是我在新表中加载的数据是从 Excel 文件中导入的。因此避免复杂性,所有列都设置为 varchar。问题仅在于日期列。我试过像 CAST([AlarmTime] AS smalldatetime) 但它不起作用。
【参考方案1】:
是的。完成。
我所做的是, 导入 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>>
我还将 dateforamat 更改为 dmy,之前是 mdy。
感谢 Suraj Singh、Deepshikha 提出的有益建议。
【讨论】:
嗨阿迪亚。你能分享一下你是如何解决这种方法的代码吗? @coddey,我已按照您的要求添加了代码/SQL 片段。我请你参考那些 请查看此链接***.com/questions/23441406/… 我需要实现这一目标。【参考方案2】:在插入时将您的列转换为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
【讨论】:
同样的错误不起作用。我尝试使用 CAST([col_name] AS smalldatetime) @Aditya 您的新表需要什么数据类型?还要检查您的列值是否有效并且可以转换为smalldatetime
嘿抱歉,实际错误是,[将 varchar 数据类型转换为 smalldatetime 数据类型导致值超出范围。]。当我使用 sql = 'select cast(col as smalldatetime) from #tmp'
我所做的是,sql='INSERT INTO New2([Col]) SELECT CAST(Col as smalldatetime) AS Col FROM #TMP'。但抛出同样的错误。
Even I can't select sql=' select CAST(col as smalldatetime) from #tmp ' 错误=将字符串转换为 smalldatetime 数据类型时转换失败。【参考方案3】:
试一试:
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;
【讨论】:
嘿,谢谢 Deepshikha。但它也抛出一个错误:[(65535 行受影响)(65535 行受影响)Msg 295,Level 16,State 3,Line 9 将字符串转换为 smalldatetime 数据类型时转换失败。 ] 您好,谢谢您的建议。帮了我很多。请检查我的回答我做了什么。【参考方案4】:试试这个
SET DATEFORMAT ymd
INSERT INTO destination_table(column_name)
SELECT Column_name As Aliace_name
FROM Source_table
【讨论】:
以上是关于如何将数据从一个表复制到另一个列数据类型不同的表?的主要内容,如果未能解决你的问题,请参考以下文章