Процедура Sql не работает должным образом
Привет,
Я использую нижеприведенную процедуру для вставки данных в таблицу, если запись не существует другого обновления, но вставка работает нормально, и обновление над правильными записями, я не знаю, где я делаю неправильно.
Что я уже пробовал:
USE [AnsiSchoolDB2] GO /****** Object: StoredProcedure [dbo].[GenFeePayment] Script Date: 3/9/2019 11:22:13 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= ALTER PROC [dbo].[GenFeePayment] @cid int, @pid int As BEGIN IF NOT EXISTS (SELECT * FROM tblFeePayment WHERE tblFeePayment.ClassID =@cid AND tblFeePayment.FeePartID =@pid) BEGIN INSERT INTO [dbo].[tblFeePayment] ([enrollID] ,[AdmissionNo] ,[classfee] ,ClassID ,[catdiscount],[studiscount] ,FeePartID ,[feeparticular] ) SELECT t.EnrollID,t.AdmissionNo, t.FeeAmount,t.ClassID,t.CatDiscountAmount,t.StuDiscountAmount,t.FeePartID,t.particular FROM (SELECT DiSTINCT tblEnrollment.EnrollID,tblStudent.AdmissionNo, tblStuCategory.CategoryID,tblStuCategory.Category,tblClass.ClassID,tblClass.ClassName,tblFeeParts.FeePartID,tblFeeParts.particular, tblClassFee.FeeAmount, tblCatDiscount.Discount AS CatDiscount, tblCatDiscount.is_Percent AS CatPercent, ISNULL((CASE WHEN tblCatDiscount.is_Percent = 1 THEN (tblClassFee.FeeAmount * tblCatDiscount.Discount) / 100 ELSE tblCatDiscount.Discount END), 0) AS CatDiscountAmount, tblStuDiscount.Discount AS StuDiscount, tblStuDiscount.is_percent AS StuPercent, ISNULL((CASE WHEN tblStuDiscount.is_percent = 1 THEN (tblClassFee.FeeAmount * tblStuDiscount.Discount) / 100 ELSE tblStuDiscount.Discount END), 0) AS StuDiscountAmount FROM [tblEnrollment] INNER JOIN tblClassFee ON tblClassFee.ClassID = tblEnrollment.ClassID INNER JOIN tblStudent ON tblStudent.StudentID = tblEnrollment.StudentID INNER JOIN tblStuCategory ON tblStuCategory.CategoryID = tblEnrollment.CategoryID INNER JOIN tblClass ON tblClass.ClassID = tblClassFee.ClassID INNER JOIN tblFeeParts ON tblFeeParts.FeePartID = tblClassFee.FeePartID INNER JOIN tblCatDiscount ON tblEnrollment.CategoryID = tblCatDiscount.CategoryID LEFT JOIN tblStuDiscount ON tblStuDiscount.EnrollID = tblEnrollment.EnrollID AND tblStuDiscount.FeeTypeID = tblFeeParts.FeeTypeID ) t WHERE ClassID =@cid AND FeePartID =@pid END ELSE BEGIN UPDATE [tblFeePayment] SET [EnrollID]= p.EnrollID ,[AdmissionNo] =p.AdmissionNo,[classfee]=p.FeeAmount ,ClassID=p.ClassID ,[catdiscount]=p.CatDiscountAmount,[studiscount]=p.StuDiscountAmount ,FeePartID=p.FeePartID , [feeparticular]=p.particular FROM (SELECT DiSTINCT tblEnrollment.EnrollID,tblStudent.AdmissionNo, tblStuCategory.CategoryID,tblStuCategory.Category,tblClass.ClassID,tblClass.ClassName,tblFeeParts.FeePartID,tblFeeParts.particular, tblClassFee.FeeAmount, tblCatDiscount.Discount AS CatDiscount, tblCatDiscount.is_Percent AS CatPercent,ISNULL((CASE WHEN tblCatDiscount.is_Percent = 1 THEN (tblClassFee.FeeAmount * tblCatDiscount.Discount) / 100 ELSE tblCatDiscount.Discount END), 0) AS CatDiscountAmount, tblStuDiscount.Discount AS StuDiscount, tblStuDiscount.is_percent AS StuPercent, ISNULL((CASE WHEN tblStuDiscount.is_percent = 1 THEN (tblClassFee.FeeAmount * tblStuDiscount.Discount) / 100 ELSE tblStuDiscount.Discount END), 0) AS StuDiscountAmount FROM [tblEnrollment] INNER JOIN tblClassFee ON tblClassFee.ClassID = tblEnrollment.ClassID INNER JOIN tblStudent ON tblStudent.StudentID = tblEnrollment.StudentID INNER JOIN tblStuCategory ON tblStuCategory.CategoryID = tblEnrollment.CategoryID INNER JOIN tblClass ON tblClass.ClassID = tblClassFee.ClassID INNER JOIN tblFeeParts ON tblFeeParts.FeePartID = tblClassFee.FeePartID INNER JOIN tblCatDiscount ON tblEnrollment.CategoryID = tblCatDiscount.CategoryID LEFT JOIN tblStuDiscount ON tblStuDiscount.EnrollID = tblEnrollment.EnrollID AND tblStuDiscount.FeeTypeID = tblFeeParts.FeeTypeID ) p WHERE p.ClassID =@cid AND p.FeePartID =@pid END END
OriginalGriff
"это не сработало" - это один из отчетов об ошибках, которые мы получаем довольно часто, и он всегда совершенно бесполезен-он ничего не говорит нам о вашей проблеме, кроме "У меня есть проблема", и мы знали это, потому что вы задаете вопрос!
Что он сделал такого, чего вы не ожидали, или не сделали того, что вы сделали?
Когда он это сделал?
Есть ли какие-либо сообщения об ошибках?
Что вы сделали, чтобы заставить его сделать это?
Что вы пытались сделать, чтобы выяснить, почему?
Каковы были результаты?
Какая помощь вам нужна?
Это все вопросы, на которые нам нужен ответ - или мы вообще не сможем вам помочь!
phil.o
В чем же проблема? Конечно, обновление будет перезаписано.
Какого результата вы ожидаете взамен?
[no name]
Проблема заключается в части обновления, она перезаписывает все записи вместо обновления только тех, которые соответствуют ClassID и FeePartID.
Значит, над теми тоже пишут, которые не совпадают.
Santosh kumar Pithani
Привет nyt72, вы просто обновляете все записи без поддержания правильной связи в производной и обновленной таблице, попробуйте использовать слияние для этих типов задач.