t-sql select count(*) в целочисленную переменную создает исключение для не может быть типа varchar не может быть преобразован в int?

#sql-server #tsql #select #count

#sql-server #tsql #выберите #count

Вопрос:

Я не новичок в технологиях SQL и имею некоторый опыт работы с PL / SQL, но T-SQL действительно работает иначе, чем PL / SQL… Я создаю триггер базы данных, который я пытаюсь вычислить / суммировать два типа значений и проверить, сколько раз они существуют в моей таблице, а затем просто реализовать бизнес-логику над этим вычислением. Все объявления типов выполняются в начале:

 USE [DB_KD_Benchmarking_SQL]
GO
/****** Object:  Trigger [dbo].[InsertTrigger_int_ext_mix_2]    Script Date: 12/2/2020 3:36:51 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER TRIGGER [dbo].[InsertTrigger_int_ext_mix_2] ON [dbo].[Ext_trial_2]
    AFTER INSERT 
    AS DECLARE @Order_id_var_2 varchar(255),
               @Country_var_2 varchar(50),
               @Panel_brand_var_2 varchar(255),
               @Int_ext_mix_var_2 char(10),
               @Business_field_var_2 char(10),
               @RC_Code_var_2 char(10),
               @FC_Code_var_2 char(10),
               @F_ident_number_var_2 varchar(255),
               @Repeated_repairs_var_2 varchar(255),
               @Same_order_ID_int int,
               @Same_order_ID_ext int,
               @Total_Same_order_ID int,
               @Total_Same_order_ID_integer int;

    DECLARE new_order CURSOR FOR
    SELECT Country, Order_id, Panel_Brand, Internal_Ext_Mix, Business_Field, RC_Code, FC_Code, F_ident_Number, Repeated_Repairs FROM inserted     
    OPEN new_order;
    FETCH NEXT FROM new_order INTO @Country_var_2, @Order_id_var_2, @Panel_brand_var_2,  @Int_ext_mix_var_2, @Business_field_var_2, @RC_Code_var_2, @FC_Code_var_2, @F_ident_number_var_2, @Repeated_repairs_var_2;
    WHILE @@FETCH_STATUS=0
    BEGIN
    
    select @Same_order_ID_int = count(*) from Ext_trial_2 where Order_id = @Order_id_var_2 and Internal_Ext_Mix = 'Int';
    Print '@Same_order_ID_int '   @Same_order_ID_int; 

    select @Same_order_ID_ext = count(*) from Ext_trial_2 where Order_id = @Order_id_var_2 and Internal_Ext_Mix = 'Ext';
    Print '@Same_order_ID_ext '   @Same_order_ID_ext; 

    set @Total_Same_order_ID = @Same_order_ID_int   @Same_order_ID_ext;
    Print '@Total_Same_order_ID '   @Total_Same_order_ID ; 
        IF @Total_Same_order_ID > 1 and (@Int_ext_mix_var_2 = 'Int' or @Int_ext_mix_var_2 = 'Ext')
          BEGIN
            Insert into Ext_trial_2 (Country, Order_id, Panel_Brand, Internal_Ext_Mix, Business_Field, RC_Code, FC_Code, F_ident_Number, Repeated_Repairs) 
                Values (@Country_var_2, @Order_id_var_2, @Panel_brand_var_2, 'Mix', @Business_field_var_2, @RC_Code_var_2, @FC_Code_var_2, @F_ident_number_var_2, @Repeated_repairs_var_2);
            Delete from Ext_trial_2 where  Order_id = @Order_id_var_2 and Internal_Ext_Mix = 'Int';
          END  
    FETCH NEXT FROM new_order INTO  @Country_var_2, @Order_id_var_2, @Panel_brand_var_2,  @Int_ext_mix_var_2, @Business_field_var_2, @RC_Code_var_2, @FC_Code_var_2, @F_ident_number_var_2, @Repeated_repairs_var_2;
    END
    CLOSE new_order
    DEALLOCATE new_order
 

Как вы можете видеть, @Same_order_ID_int amp; @Same_order_ID_ext amp; @Total_Same_order_ID определяется как тип int . Здесь я пытаюсь присвоить им значения :

 select @Same_order_ID_int = count(*) from Ext_trial_2 where Order_id = @Order_id_var_2 and Internal_Ext_Mix = 'Int';
    Print '@Same_order_ID_int '   @Same_order_ID_int; 

    select @Same_order_ID_ext = count(*) from Ext_trial_2 where Order_id = @Order_id_var_2 and Internal_Ext_Mix = 'Ext';
    Print '@Same_order_ID_ext '   @Same_order_ID_ext; 

    set @Total_Same_order_ID = @Same_order_ID_int   @Same_order_ID_ext;
    Print '@Total_Same_order_ID '   @Total_Same_order_ID ; 
 

Эта часть триггера всегда вызывает исключение и создает ошибку и вызывает исключение почему я пытаюсь вставить строку для таблицы, которую я определил :

Ошибка преобразования при преобразовании значения varchar в тип данных int для переменной @Same_order_ID_int . Когда я меняю тип Same_order_ID_int на varchar(255), он работает нормально и возвращает некоторые результаты и присваивает переменной строку ‘1’ или ‘0’.

Тогда это приводит к ошибке в методе вычисления для суммирования этих переменных :

 set @Total_Same_order_ID = @Same_order_ID_int   @Same_order_ID_ext;
 

возвращает строку «10» или «01» или «11», которая определенно не является правильным целочисленным значением. Может кто-нибудь, пожалуйста, объясните мне, где может быть проблема в моих расчетах?

Я использую SQL Server 2016 версии сборки 13.0.5.

Заранее спасибо за ваши ответы.

Комментарии:

1. Все эти DECLARE s имеют запах кода для них, и вы предполагаете, что a TRIGGER встречается один раз в строке (или, что еще хуже INSERT , может быть только INSERT 1 строка за раз). Это не так, как работают триггеры или INSERT операторы,

2. Позвольте мне переформатировать этот вопрос, добавив сюда весь код триггера.

3. Ну, вы же не предполагаете, что там есть одна строка, но a CURSOR в a TRIGGER будет ужасно для производительности. Вам действительно нужно использовать решения на основе наборов в a TRIGGER , большое INSERT значение в таблице было бы очень медленным и дорогостоящим с таким TRIGGER .

4. Спасибо за рекомендацию… Здесь тема такова: я пытаюсь запустить курсор над «вставленной» таблицей, которая, как я предполагаю, содержит только строки оператора AFTER INSERT. Что касается бизнес-логики и требований, я должен реализовать это следующим образом. Любое другое эффективное решение полностью приветствуется, и я могу одобрить, что оно работает медленно с данными миграции, которые я вставляю.

5.Зачем вам вообще нужен курсор в a TRIGGER ? Если вы не должны CURSOR делать это в TRIGGER , поместите данные в другое место, а затем обработайте эти данные в CURSOR запланированной задаче. (Хотя я все еще сомневаюсь CURSOR , что а нужно.)

Ответ №1:

Вот ваша проблема

 declare @Same_order_ID_int int = 2

Print '@Same_order_ID_int '   @Same_order_ID_int; 
 

сбой с

 Msg 245, Level 16, State 1, Line 3
Conversion failed when converting the varchar value '@Same_order_ID_int ' to data type int.
 

Потому что вы пытаетесь использовать оператор ‘ ‘ с varchar и int . Вместо этого используйте CONCAT, который обрабатывает преобразование строки и преобразование нулевой строки в пустую.

 Print concat('@Same_order_ID_int ', @Same_order_ID_int); 
 

Комментарии:

1. Слепые люди задают вопросы … 🙂 Спасибо за вашу доброту, постараюсь одобрить ответ здесь. Извините за то, что я слепой и новичок, и спасибо за ваше любезное время, которое вы прочитали и ответили на мой вопрос.