Member 9994001 Ответов: 1

Два оператора insert into в хранимой процедуре с тем же предложением where в SQL server


я использую два оператора insert into в одной хранимой процедуре, эта хранимая процедура будет выполняться автоматически, для первого оператора insert into я получаю все строки, но для второго оператора insert into я получаю нулевые строки из-за условия "
where P_Date NOT IN (SELECT P_Date from Tbl_EmpPunchingDetail)
"Может ли кто-нибудь подсказать мне, что я должен получить только одну строку для каждой даты для каждого PIN-кода без повторения при выполнении сохраненного procdeure несколько раз для второй вставки в Оператор???? или как я могу использовать одно предложение where для обоих операторов insert into ??

Что я уже пробовал:

<pre>CREATE PROCEDURE [dbo].[sp_UpdateEmpPunchingDetailTbl]
AS
BEGIN
    --First insert into statement
    INSERT INTO Tbl_EmpPunchingDetail
    SELECT Pin_Code AS Pin_Code
        ,P_Date AS P_Date
        ,IN1 AS IN1
        ,OUT1 AS OUT1
    FROM [Zultime].[dbo].[TIME_SHEET]
    WHERE P_Date NOT IN (
            SELECT P_Date
            FROM Tbl_EmpPunchingDetail
            )
        AND P_Date <= dateadd(day, datediff(day, 1, GETDATE()), 0)

    --Second insert into statement
    DECLARE @mydate DATETIME

    SELECT @mydate = GETDATE()

    DECLARE @P_Date TABLE ([P_Date] DATE)

    INSERT INTO @P_Date
    SELECT DISTINCT [P_Date]
    FROM [Zultime].[dbo].[TIME_SHEET]
    WHERE [P_Date] BETWEEN CONVERT(VARCHAR(25), DATEADD(dd, - (DAY(@mydate) + 8), @mydate), 101) 
    AND CONVERT(VARCHAR(25), DATEADD(dd, - (DAY(@mydate) - 22), @mydate), 101)

    INSERT INTO Tbl_EmpPunchingDetail
    SELECT [Pin_Code]
        ,P_Date
        ,'07:30' AS [IN1]
        ,'16:30' AS [OUT1]
    FROM [AttendanceCorrection].[dbo].[Tbl_FMOEmp]
    CROSS JOIN @P_Date
    WHERE P_Date NOT IN (
            SELECT P_Date
            FROM Tbl_EmpPunchingDetail
            )
        AND P_Date <= dateadd(day, datediff(day, 1, GETDATE()), 0)
END

1 Ответов

Рейтинг:
0

pooranendu

Я удивлен, почему вы не используете Union Statement, например

CREATE PROCEDURE [dbo].[sp_UpdateEmpPunchingDetailTbl]
AS
BEGIN

    DECLARE @mydate DATETIME

    SELECT @mydate = GETDATE()

    DECLARE @P_Date TABLE ([P_Date] DATE)

    INSERT INTO @P_Date
    SELECT DISTINCT [P_Date]
    FROM [Zultime].[dbo].[TIME_SHEET]
    WHERE [P_Date] BETWEEN CONVERT(VARCHAR(25), DATEADD(dd, - (DAY(@mydate) + 8), @mydate), 101) 
    AND CONVERT(VARCHAR(25), DATEADD(dd, - (DAY(@mydate) - 22), @mydate), 101)

    --First insert into statement
    INSERT INTO Tbl_EmpPunchingDetail
    SELECT Pin_Code AS Pin_Code
        ,P_Date AS P_Date
        ,IN1 AS IN1
        ,OUT1 AS OUT1
    FROM [Zultime].[dbo].[TIME_SHEET]
    WHERE P_Date NOT IN (
            SELECT P_Date
            FROM Tbl_EmpPunchingDetail
            )
        AND P_Date <= dateadd(day, datediff(day, 1, GETDATE()), 0)

 Union
 SELECT [Pin_Code]
        ,P_Date
        ,'07:30' AS [IN1]
        ,'16:30' AS [OUT1]
    FROM [AttendanceCorrection].[dbo].[Tbl_FMOEmp]
    CROSS JOIN @P_Date
    WHERE P_Date NOT IN (
            SELECT P_Date
            FROM Tbl_EmpPunchingDetail
            )
        AND P_Date <= dateadd(day, datediff(day, 1, GETDATE()), 0)

END