nyt72 Ответов: 2

Процедура 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, вы просто обновляете все записи без поддержания правильной связи в производной и обновленной таблице, попробуйте использовать слияние для этих типов задач.

2 Ответов

Рейтинг:
1

Santosh kumar Pithani

;WITH CTE
AS (
	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
	WHERE   tblClass.ClassID = @cid
		AND tblFeeParts.FeePartID = @pid
	)

UPDATE [tblFeePayment]
SET [EnrollID] = CTE.EnrollID
	,[AdmissionNo] = CTE.AdmissionNo
	,[classfee] = CTE.FeeAmount
	,ClassID = CTE.ClassID
	,[catdiscount] = CTE.CatDiscountAmount
	,[studiscount] = CTE.StuDiscountAmount
	,FeePartID = CTE.FeePartID
	,[feeparticular] = CTE.particular
FROM [tblFeePayment]
INNER JOIN CTE ON (
		    [tblFeePayment].ClassID = CTE.ClassID
		AND [tblFeePayment].FeePartID = CTE.FeePartID
		)


[no name]

Спасибо Сантошу, я пробовал это, но безуспешно, когда я обновляю, то, что он делает, дублирует top to records поверх других записей в том же классе.

Santosh kumar Pithani

Попробуйте удалить дубликаты с помощью функции Rownumber on (ClassID,FeePartID) все еще не ясно, тогда лучше разместить фиктивные данные вместе с ожидаемым результатом.

Рейтинг:
0

Aarti Meswania

Насколько ваш запрос неверен?
вы написали предложение where, но оно находится только во временной таблице (то есть внутри подзапроса) здесь, вы также должны написать предложение where в таблице tblFeePayment.

Так что попробуйте это

;WITH temp AS
(
	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 
	WHERE 
		tblClass.ClassID =@cid AND tblFeeParts.FeePartID =@pid -----HERE IT IS KEY FILTER
)
UPDATE 
	FP
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
	[tblFeePayment] FP 
	INNER JOIN temp AS P -----HERE IT IS JOIN TO UPDATE PARTICULAR ROW IN tblFeePayment
	ON FP.ClassID = P.ClassID AND FP.FeePartID = P.FeePartID

Счастливого Кодирования!
:)