2015-02-12 2 views
0

Вот процедура, которую я использовал ........Как избежать дубликатов при вставке записи с помощью хранимой процедуры ...?

CREATE procedure AcademicDetailsInsert 
    @CandidateId int, 
    @DegreeIDs varchar(25), 
    @Board_Universities varchar(200), 
    @YearsOfPassing varchar(50), 
    @Percentages varchar(50) 
As 
    set NOCOUNT ON 
    DECLARE @ReturnValue INT 
BEGIN 
    BEGIN TRY 
     select @ReturnValue = 0 

     IF EXISTS (SELECT ITEM AS DegID 
        FROM [SplitString](@DegreeIDs,',')) 
      INSERT INTO [AcademicDetails] ([CandidateID], [DegreeId], [Board_University], [Year_Of_Passing], [Percentage]) 
       SELECT 
        @CandidateID, 
        DegID.ITEM, Board_Uni.Item, YOfPass.ITEM, 
        Perc.ITEM 
       FROM  
        [splitString](@DegreeIDs, ',') DegID, 
        [splitString](@Board_Universities, ',') Board_Uni, 
        [splitString](@YearsOfPassing, ',') YOfPass,   
        [splitString](@Percentages, ',') Perc 
       WHERE 
        DegID.ITEM NOT IN (SELECT DegreeID 
             FROM AcademicDetails 
             WHERE CandidateID = @CandidateID)     
    END TRY 
    BEGIN CATCH 
     SELECT  
      ERROR_NUMBER() AS ERROR_NO, 
      ERROR_MESSAGE() AS ERROR_MSG, 
      ERROR_LINE() AS ERROR_LINE_NO 
    END CATCH  
END 

И это код, который я использовал для запуска процедуры ...

EXEC AcademicDetailsInsert 1,'2,3','NMU,IND','2005,2008','66.33,71.65' 

И вот результат ..

1 2 nmu 2005 66.33 
1 2 nmu 2008 66.33 
1 2 nmu 2005 23.65 
1 2 nmu 2008 23.65 
1 2 nasik 2005 66.33 
1 2 nasik 2008 66.33 
1 2 nasik 2005 23.65 
1 2 nasik 2008 23.65 
1 3 nmu 2005 66.33 
1 3 nmu 2008 66.33 
1 3 nmu 2005 23.65 
1 3 nmu 2008 23.65 
1 3 nasik 2005 66.33 
1 3 nasik 2008 66.33 
1 3 nasik 2005 23.65 
1 3 nasik 2008 23.65 

Когда я прохожу деталь для двух записей для одного кандидата дать другой результат

Но вместо двух записей я получаю повторную запись. Функция SplitString используется для разделения функций, чтобы разделить степень, разные названия университетов и год и проценты.

Как я могу избежать этого ...?

+2

SQL Server 2008 имеет [таблица значение параметров] (https: // MSDN. microsoft.com/en-us/library/bb510489.aspx), который я использовал бы здесь вместо разбора строк. –

+1

Вы делаете 'CROSS JOIN' в своем' SELECT'. Вот почему вы получаете больше записей, чем нужно. –

+0

Так как я могу избежать CROSS JOIN, чтобы вставить эту две записи ..? – kls

ответ

0

вы сделали Cross Join, так что результаты похожи, что

Попробуйте использовать код, приведенный ниже, Надеюсь, что это будет работать

ALTER procedure AcademicDetailsInsert 
@CandidateId int, 
@DegreeIDs varchar(25), 
@Board_Universities varchar(200), 
@YearsOfPassing varchar(50), 
@Percentages varchar(50) 
As 
set NOCOUNT ON 
DECLARE @ReturnValue INT 
BEGIN 
BEGIN TRY 
select @ReturnValue = 0 
IF EXISTS 
( 
    SELECT ITEM AS DegID 
    FROM [SplitString](@DegreeIDs,',') 
) 
INSERT INTO [AcademicDetails] 
(  
    [CandidateID], 
    [DegreeId], 
    [Board_University], 
    [Year_Of_Passing], 
    [Percentage] 
) 

SELECT CandidateID,DegID,Board_Uni,YOfPass,Perc FROM 
(
SELECT 


    @CandidateID AS CandidateID, 
     SUBSTRING(@DegreeIDs,0,CHARINDEX(',',@DegreeIDs)-1) AS DegID , 
     SUBSTRING(@Board_Universities,0,CHARINDEX(',',@Board_Universities)-1) AS Board_Uni , 
     SUBSTRING(@YearsOfPassing,0,CHARINDEX(',',@YearsOfPassing)-1) AS YOfPass, 
     SUBSTRING(@Percentages,0,CHARINDEX(',',@Percentages)-1) AS Perc 

     UNION 
    SELECT @CandidateID AS CandidateID, 


     SUBSTRING(@DegreeIDs,CHARINDEX(',',@DegreeIDs),Len(@DegreeIDs)) AS DegID, 
     SUBSTRING(@Board_Universities,CHARINDEX(',',@Board_Universities),Len(@DegreeIDs)) AS Board_Uni, 
     SUBSTRING(@YearsOfPassing,CHARINDEX(',',@YearsOfPassing),Len(@DegreeIDs)) AS YOfPass , 
     SUBSTRING(@Percentages,CHARINDEX(',',@Percentages),Len(@DegreeIDs)) AS Perc 



    ) AS RandomTable 


where DegID not IN ( SELECT DegreeID 
           FROM AcademicDetails 
           WHERE CandidateID = @CandidateID 
          )    
END TRY 
BEGIN CATCH 
SELECT ERROR_NUMBER() AS ERROR_NO, 
      ERROR_MESSAGE() AS ERROR_MSG, 
      ERROR_LINE() AS ERROR_LINE_NO 
END CATCH  
END 
+0

Очень вероятно, что если бы было известно, что процедура всегда принимает ровно два значения в строках, разделенных запятыми, процедура будет иметь только обычные параметры, и нет необходимости в синтаксическом анализе строк. Весьма вероятно, что эта процедура, как ожидается, будет работать, если заданные строки имеют более двух значений, разделенных запятыми, и возможное количество значений неизвестно заранее. –

+0

, в этом случае вопрос должен упоминать, каково это должно быть, что я просто предполагаю по его коду, что, если ему нужно больше 1 значения (скажем n), тогда должна быть проверка для каждого параметра, чтобы иметь равное количество значений, разделенных запятыми , –

Смежные вопросы