2013-12-12 2 views
3

Я пытаюсь перенести базу данных SQL Server с 2005 по SQL Server 2012.Что нового в SQL Server 2012 о кастинге в ISNULL()

Когда я отсоединить и присоединить базу данных на новый 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.

Я попытаюсь зафиксировать след этого запроса, чтобы увидеть, как мое приложение отправляет этот BIT (булев) тип. Я уверен, что в базу данных отправлено целое число 1.

Я предпочитаю вносить изменения в уровень сервера, поэтому мне не нужно проходить через множество XML-подобных, чтобы явное выделение целых чисел в биты.

Есть ли что-нибудь, что я могу сделать с моей базой данных, чтобы еще раз принять 1 как булев?

Копаем глубже Я понял, что есть проблема только при использовании функции ISNULL().

Я заменил isnull(@bit_typ, 0) только @bit, и мой запрос прошел хорошо.

Есть ли обратная совместимость для функции ISNULL на SQL Server 2012?

+2

ISNULL() по-прежнему поддерживается в SQL 2012. Какая именно ошибка вы получаете? –

+0

Что это за XML, который вы показываете нам и как вы его используете? В частности, я спрашиваю, что это за объект/язык? SQL Server напрямую не выполняет XML AFAIK, поэтому это должно быть частью какого-либо другого объекта. – RBarryYoung

+0

@SebastianMeine Не удается получить доступ к полю 'my_column_typ_bit' как тип Integer – adopilot

ответ

15

В 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) 

SQLNCLI11.0 против SQL Server 2012 выполняет эту функцию, чтобы получить типы данных для параметра :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