【问题标题】:Not able to update column which was set as null using 'select into' statement in sybase无法更新在 sybase 中使用“select into”语句设置为空的列
【发布时间】:2025-12-27 00:20:08
【问题描述】:

我正在 sybase 中创建一个临时表,如下所示

select col1 = null, col2 =2 into #myTable 

当我尝试更新 col1 时

update #myTable  set col1 = 'test'

我收到错误 - “[错误代码:257,SQL 状态:42000] 不允许从数据类型 'VARCHAR' 到 'INT' 的隐式转换。使用 CONVERT 函数运行此查询。”

谁能帮我解决一下?

【问题讨论】:

    标签: sql database sybase temp-tables


    【解决方案1】:

    假设这是 Sybase ASE(257 是标准 ASE 系统错误号)...

    col1=null 不会告诉数据库col1 的数据类型应该是什么,因此数据库默认列的数据类型为int

    通过select/into 创建表时,您需要确保使用所需的数据类型创建每列。对于这个特定实例,请尝试:

    select col1=convert(varchar(10),null), col2=convert(tinyint,2) into #myTable 
    

    注意事项:

    • 修改convert() 调用以引用所需的数据类型
    • 当从另一个表的列填充新列时,源列数据类型将用于确定新列的数据类型

    还要记住以下几点:

    select col1='test' into #otherTable
    

    col1 的数据类型将根据初始数据值确定;在这种情况下,值'test' 告诉数据库您需要存储4 个字符,因此数据库将默认列的数据类型为varchar(4)。这应该没问题,只要您从不打算插入超过 varchar(4) 的任何内容,否则您需要提供带有初始 select/intoconvert() 以明确说明列的数据类型,例如:

    select col1=convert(varchar(35),'test') into #otherTable
    

    假设您通过了 不允许从数据类型 'VARCHAR' 到 'INT' 的隐式转换。 如果您尝试以下操作,可能会出现错误消息: p>

    update #myTable set col2 = NULL
    

    结果是您看到类似于 column does not allow nulls 的错误消息。

    与确定数据类型一样,Sybase (ASE) 将尝试以几种不同的方式确定列的 NULLability:

    • 如果为列分配了 NULL 的“值”(如示例中:col1 = null),则 ASE 将配置该列以允许 NULL
    • 如果该列的值是从另一个表中复制的,则源列的 NULLability 将用于确定新列的 NULLability
    • 如果查询明确将列定义为 NULLable(参见下面的示例),那么该列将被配置为允许 NULL
    • 如果数据库选项 allow nulls by defaultfalse(ASE 默认设置),那么列的 NULLability 将设置为“not NULL”
    • 当一切都失败时...
    • 如果数据库选项allow nulls by defaulttrue,那么列的NULLability 将设置为'NULL'(able)

    显式定义列以允许 NULL 的示例:

    select col1 = convert(varchar(35) null,'test') into #otherTable
    

    【讨论】: