有关在ISNULL()中进行转换的SQL Server 2012有哪些新增内容

 冯筠萍建婷 发布于 2023-02-10 13:11

我正在尝试将SQL Server数据库从2005迁移到SQL Server 2012.

当我将数据库分离并附加到新的SQL Server 2012时,我的应用程序大部分时间都可以正常工作.

我的app服务器尝试编写(更新)类型列时,我才遇到问题BIT.在我必须编写或更新列的情况下,我收到错误:

无法将字段'my_column_typ_bit'作为Integer类型访问

执行该语句的代码如下所示:


    
    update art 
    set
        sifra = :sifra ,
        naziv = :naziv ,
        naziv_strani = :naziv_strani ,
        sifra_dob = :sifra_dob ,
        naziv_fiskalni = :naziv_fiskalni ,
        jm = :jm_id ,
        tbr_id = :tbr_id ,
        car_stp = :carinska_stopa ,
        trosarina = :trosarina ,
        opis = :opis ,
        vrsta_id = :vrsta_id ,
        podvrsta_id = :podvrsta_id ,
        rg_id = :rabatna_grupa_id ,
        vaga = :vaga ,
        konsignacija = IsNull( :konsignacija ,0) ,
        ambalaza = IsNull( :ambalaza ,0) ,
        proizvod = IsNull( :proizvod ,0) ,
        nusproizvod = IsNull( :nusproizvod ,0) ,
        materijal = IsNull( :materijal ,0) ,
        par_id = :par_id ,
        user_id = (
            case when :user_id = 0 
                then user_id 
                else :user_id 
            end) ,
        ts = GetDate(),
        podgrupa_2 = :podgrupa2_id ,
        faktor_palete = :faktor_palete ,
        faktor_pakovanja = :faktor_pakovanja ,
        za_narudzbu = :za_narudzbu,
        dani_nabave = :dani_nabave,
        dani_nabave_opt = :dani_nabave_opt ,
        dani_pro_avg = :dani_pro_avg ,
        auto_minopt = :auto_minopt ,
        car_tar_br_id = :car_tar_br_id ,
        car_faktor = ISNULL( :car_faktor ,1) ,
        vaga_id = ISNULL(vaga_id , :vaga_id ),
        car_sifra = :car_sifra ,
        naknada_id = :pov_nak_id ,
        tezina = :tezina ,
        stp_kalo_mal = :stp_kalo_mal ,
        stp_kalo_mat = :stp_kalo_mat ,
        stp_kalo_vel = :stp_kalo_vel ,
        jm_izv_id = :izv_jm_id ,
        jm_izv_koef = :izv_jm_koef ,
        drz_pod_id = :drz_pod_id ,
        deklaracija_id = :deklaracija_id ,
        aktivan = IsNull( :aktivan ,1) , --This is my BIT COLUMN
        gift = IsNull( :gift ,0) ,
        vaga_public = IsNull( :vaga_public ,0) ,
        vaga_pub_id = :vaga_pub_id
    where
        id = :id
    

这部分代码在SQL Server 2005下运行 - 为什么它在SQL Server 2012下不起作用?

我的数据库设置为兼容级别:SQL Server 2005(90).

我试图更改数据库的排序规则以匹配SQL Server.

我将尝试捕获此查询的跟踪,以查看我的应用程序如何发送此BIT(布尔)类型.我很确定有一个整数1发送到数据库.

我更喜欢在服务器层进行更改,所以我不需要经过很多这样的XML来显式地将整数转换为位.

有什么我可以对我的数据库做什么再次接受1作为布尔值?

深入挖掘我意识到使用ISNULL()功能时只会出现问题.

isnull( @bit_typ, 0)只更换了@bit,我的查询传递得很好.

ISNULLSQL Server 2012上的函数是否具有向后兼容性?

1 个回答
  • 在SQL Server 2012中,有一个新的存储过程可用于获取参数sp_describe_undeclared_pa​​rameters(Transact-SQL)的数据类型.连接到SQL Server 2012时,驱动程序SQLNCLI11.0使用该存储过程.

    较旧的驱动程序和SQLNCLI11.0连接到SQL Server 2008或更早版本时,它使用set fmtonly执行查询以检查谓词中使用的列的数据类型.

    对于如下所示的查询:

    select name from unit where active = isnull(:x, 1)
    

    针对SQL Server 2012的SQLNCLI11.0执行此操作以获取参数的数据类型:x.

    exec [sys].sp_describe_undeclared_parameters N'select name from unit where active = isnull(@P1, 1)'
    

    结果:

    parameter_ordinal name   suggested_system_type_id suggested_system_type_name   
    ----------------- ------ ------------------------ -----------------------------
    1                 @P1    56                       int                          
    

    使用较旧的驱动程序,它看起来像是从使用的列中获取数据类型:

    set fmtonly on select active from  unit where 1=2 set fmtonly off
    

    如果你重写查询使用isnull(:x, cast(1 as bit)),然后sp_describe_undeclared_parameters将返回的数据类型的参数作为bit.

    @RLF评论中建议的重写IsNull( :aktivan ,0x1)也可以.

    另一种方法是DataTypeCompatibility=80在您的连接字符串中设置.然后SQLNCLI11.0也将set fmtonly用于获取参数的数据类型.将ADO与SQL Server Native Client一起使用

    2023-02-10 13:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有