#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 имеют запах кода для них, и вы предполагаете, что aTRIGGER
встречается один раз в строке (или, что еще хужеINSERT
, может быть толькоINSERT
1 строка за раз). Это не так, как работают триггеры илиINSERT
операторы,2. Позвольте мне переформатировать этот вопрос, добавив сюда весь код триггера.
3. Ну, вы же не предполагаете, что там есть одна строка, но a
CURSOR
в aTRIGGER
будет ужасно для производительности. Вам действительно нужно использовать решения на основе наборов в aTRIGGER
, большое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. Слепые люди задают вопросы … 🙂 Спасибо за вашу доброту, постараюсь одобрить ответ здесь. Извините за то, что я слепой и новичок, и спасибо за ваше любезное время, которое вы прочитали и ответили на мой вопрос.