gpt4 book ai didi

sql-server - SQL Server 2012 中关于在 ISNULL() 中进行转换的新增功能

转载 作者:行者123 更新时间:2023-12-01 07:13:58 27 4
gpt4 key购买 nike

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

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

只有当我的应用服务器尝试写入(更新)类型为 BIT 的列时,我才会遇到问题.在我必须编写或更新列的情况下,我收到一个错误:

Cannot access field 'my_column_typ_bit' as type of Integer



执行该语句的代码如下所示:
<sequence name="ListaArtikalaSingle-update-artikal" type="script">
<SQL>
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>
</sequence>

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

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

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

我将 try catch 此查询的跟踪,以查看我的应用程序如何发送此 BIT ( bool )类型。
我很确定有作为整数 1 发送到数据库。

我更喜欢在服务器层进行更改,因此我不必通过大量这样的 XML 来显式地将整数转换为位。

我可以对我的数据库做些什么来让它再次接受 1 作为 bool 值?

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

我换了 isnull( @bit_typ, 0)只有 @bit我的查询通过得很好。
ISNULL 是否有向后兼容性SQL Server 2012 上的函数?

最佳答案

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

较旧的驱动程序以及当 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获取参数的数据类型。 Using ADO with SQL Server Native Client

关于sql-server - SQL Server 2012 中关于在 ISNULL() 中进行转换的新增功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20592299/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com