Sql server 转换varchar值时转换失败';SAT和x27;到数据类型int

Sql server 转换varchar值时转换失败';SAT和x27;到数据类型int,sql-server,Sql Server,我有一个表ConsoleGames,其中所有列的类型都是varchar(50)。当我试图通过使用查询修改现有数据类型来创建新表时: CREATE TABLE console_games ( game_rank integer, game_name varchar(1200), platform_name varchar(1200), game_year integer, genre varchar(200), publisher varchar(1

我有一个表
ConsoleGames
,其中所有列的类型都是
varchar(50)
。当我试图通过使用查询修改现有数据类型来创建新表时:

CREATE TABLE console_games
(
    game_rank integer,
    game_name varchar(1200),
    platform_name varchar(1200),
    game_year integer,
    genre varchar(200),
    publisher varchar(1200),
    na_sales float,
    eu_sales float,
    jp_sales float,
    other_sales float
)

INSERT INTO console_games
    SELECT * 
    FROM [dbo].[RAWConsoleGames]
我收到以下错误消息:

Msg 245,16级,状态1,第17行
将varchar值“SAT”转换为数据类型int时,转换失败

当我查看表中的数据时,值“SAT”位于我不更改其数据类型的列中SAT'值存在于
Platform
列中,该列属于
varchar
类型,我不想将该类型更改为int

任何帮助都将不胜感激


谢谢

很明显,“SAT”不是也永远不会转换为整数

始终最好指定要插入的列。。。事情变了

现在,如果源数据可疑,请添加
try\u convert()
。如果转换失败,将返回空值

我不知道你的消息来源的列名,所以我用SomeColN代替了

INSERT INTO console_games
SELECT try_convert(integer      ,SomeCol1)
      ,try_convert(varchar(1200),SomeCol2)
      ,try_convert(varchar(1200),SomeCol3)
      ,try_convert(integer      ,SomeCol4)
      ,try_convert(varchar(200) ,SomeCol5)
      ,try_convert(varchar(1200),SomeCol6)
      ,try_convert(float        ,SomeCol7)
      ,try_convert(float        ,SomeCol8)
      ,try_convert(float        ,SomeCol9)
      ,try_convert(float        ,SomeCol10)
 FROM [dbo].[RAWConsoleGames]
只是为了好玩,试试:

Select try_convert(int,'SAT')
Select try_convert(int,'25.25')
Select try_convert(int,'25')

您应该始终定义要插入的列的列表,并且还应该始终定义要从中选择的列的列表。此外,我建议显式地执行任何类型转换,而不是将其留给SQL Server—如果您自己进行转换,您就知道自己在做什么

所以我会这样写这句话:

-- **DEFINE** the list of columns you're inserting into
INSERT INTO console_games (rank, name, Platform, year, genre, publisher, 
                           sales, eu_sales, jp_sales, other_sales) 
    -- **DEFINE** the list of columns you're selecting, and any conversions
    SELECT     
        game_rank, game_name, platform_name, 
        CAST(game_year AS VARCHAR(50)), genre,
        publisher, 
        CAST(na_sales AS VARCHAR(50)), 
        CAST(eu_sales AS VARCHAR(50)),
        CAST(jp_sales AS VARCHAR(50)),
        CAST(other_sales AS VARCHAR(50))
    FROM 
        [dbo].[RAWConsoleGames]

请同时发布
RAWConsoleGames
的模式!也许两个表中的列顺序不同…@mako确切地说,但我们为什么要试着猜测呢?@GiorgosAltanis我们只能等他…下面是ConsoleGames的模式(排名varchar(5000)、名称varchar(50)、平台varchar(50)、年份varchar(50)、类型varchar(200)、出版商varchar(1200)、销售varchar(50),eu_sales varchar(50),jp_sales varchar(50),other_sales varchar(50)我不同意,
try_convert
会隐藏问题,但不会解决问题(假设源表中隐藏了虚假数据)。然而,建议“始终最好指定要插入的列……情况会发生变化”这一点非常重要……我自己也曾多次成为自己匆忙行为的牺牲品。[尽管如此,这个select*“技术”可以揭示模式同步问题,我想这里没有黑/白]@GiorgosAltanis这是一个选择。一个人可能会因为一个虚假/意外的值而让整个作业失败。数据卫生是一场持续的战斗。这也取决于工作的阶段。在ETL开发的早期阶段和生产、日常操作中存在不同的需求,当然,你可能不希望因为一个虚假的值而导致作业失败s值,但您当然希望找到并报告此假值。@GiorgosAltanis个人认为,我首先将所有数据加载到暂存环境中。这是我们运行验证例程的地方。根据问题的不同,我们会出现警告或严重故障。一个假风险评级只是警告,而数据加倍则是严重故障如你所说,这里没有黑与白:)