我正在尝试将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
,我的查询传递得很好.
ISNULL
SQL Server 2012上的函数是否具有向后兼容性?
在SQL Server 2012中,有一个新的存储过程可用于获取参数sp_describe_undeclared_parameters(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一起使用