Member 12314309 Ответов: 1

Как результат процедуры хранения вставить в таблицу в SQL?


У меня есть хранимая процедура, теперь я хочу, чтобы вставить результат из хранимой процедуры в таблицу EmployeeAttendance Коль(AttID,empid в,Интайм,OUTTIME,часов,долг,от OTAmount,поздно

вот моя магазинная процедура....

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

<pre>ALTER PROCEDURE [dbo].[GetMachineAttendanceFinal5]

AS

BEGIN

      SET NOCOUNT ON;

     
;WITH Dates (ReportingDate) 
AS (
   SELECT CONVERT(date, '2018-11-26 00:00:00.000', 120) AS ReportingDate
   UNION ALL
   SELECT DATEADD(day, 1, d.ReportingDate)
   FROM Dates d
   WHERE d.ReportingDate < CONVERT(date, '2018-12-25 00:00:00.000', 120))

,CTE As
    (
    select EmployeeDetails.EmpID,EmployeeDetails.EmpName,EmployeeDetails.OTEntitled,EmployeeDetails.Empcur,EmployeeDetails.Dhour,EmployeeDetails.LTime from EmployeeDetails where Empcur='Join'
    )
    ,CTE4 As
    (
    Select MachineAttendance.EmpID,MachineAttendance.MDate,MachineAttendance.INOUT from MachineAttendance
    ) 
    
    ,cte1 AS
    (
    SELECT CTE4.EmpID, CAST(CTE4.MDate as Date) AS [Date], 
    CASE WHEN CTE4.INOUT = 1 THEN CTE4.MDate END AS INOUT_INTIME,
    CASE WHEN CTE4.INOUT = 2 THEN CTE4.MDate END AS INOUT_OUTTIME
    From 
     CTE4
    
    ), 
   cte2 
    as
    (
    select cte1.EmpID, Date, MAX(INOUT_INTIME) AS INTIME, 
                          MAX(INOUT_OUTTIME) AS OUTTIME
    , DATEDIFF(Hour, MAX(INOUT_INTIME), MAX(INOUT_OUTTIME)) as [Hours]
    FROM CTE1
    GROUP BY EmpID, [Date]
    )
    select cte.EmpID,d.ReportingDate,cte2.Date,cte2.INTIME,  cte2.OUTTIME,  cte2.[Hours]
    , CASE WHEN  cte2.[Hours] >= 8 THEN 1
    WHEN  cte2.[Hours] = 0 THEN 0
    WHEN  cte2.[Hours] >= 6 THEN 0.5 END AS [Day],
    CASE WHEN  cte2.[Hours] > CTE.Dhour then  cte2.[Hours] - CTE.Dhour else 0 End as OT,
    CASE when   
    cte.OTEntitled = 'Yes'  AND cte2.[Hours] >= CTE.Dhour 
THEN (( cte2.[Hours] - 8) * 100) else 0 END AS OTAMount,  

   
    Convert(varchar(10), cte2.INTIME,108) as [Time],
   Case When Convert(Time, cte2.INTIME,108) > cte.LTime Then 1 else 0 end as Late    
    from cte Cross Apply Dates d 
		Left Join cte2 ON cte2.EmpId= cte.EmpID AND cte2.Date=d.ReportingDate
    order by cte.EmpID asc 

OriginalGriff

И что же?
Вы написали СП, вы знаете, что он делает.
Так в чем же проблема модификации его для выполнения относительно тривиальной задачи?

Member 12314309

я определил col выше в таблице посещаемости,то есть результат этого SP,этот результат я хочу вставить в таблицу employeeattendance

OriginalGriff

С риском повториться:
- И что же?
Вы написали СП, вы знаете, что он делает.
Так в чем же проблема модификации его для выполнения относительно тривиальной задачи?"

Помните, что мы не можем видеть ваш экран, мы не можем получить доступ к вашему жесткому диску, мы не можем читать ваши мысли. Мы получаем только то, что вы печатаете для работы.
Поэтому мы понятия не имеем, почему что-то оказывается трудным, особенно для тех, кто, очевидно, может писать относительно сложный SQl без каких-либо проблем ... и если мы не знаем, почему это создает вам трудности, мы не можем ответить на вопрос, который вы не задавали!

Member 12314309

Уважаемый Оригинал ,любезно не берите его на головную боль ,,,просто я просто спрашиваю о том, как результат SP, поступающий в колонку, вставить в таблицу ,
У меня есть посещаемость машины talbe,в которой сотрудник INtime и OUttime приходит 1 и 2,из этого INTIME и OUTTIME я рассчитал часы,OT,OTamount и Late, теперь эти результаты столбца я хочу вставить в другую таблицу....

OriginalGriff

Я прогнал это через Google Translate который сказал
- Я студентка, и это мое домашнее задание. Я нашел какой-то код в интернете, но я его совсем не понимаю, и он не делает именно то, что мне нужно, чтобы передать его моему учителю. Пожалуйста, сделай за меня домашнее задание."

Это верно?

CHill60

Лол! Я узнаю биты "его" кода из одного из моих решений, и некоторые из них пришли от MadMyche. Этот вампир-настоящий помощник и не прилагает никаких усилий, чтобы понять.

Member 12314309

Лолз...я нашел решение вот в чем ... Вставить в EmployeesAttendance
EXEC GetMachineAttendanceFinal5 ... но как ограничить ту запись, которая уже выходит в таблицу

ZurdoDev

Что он сказал ^

Member 12314309

я сказал ,что результат SP ,то есть значение, которое я рассчитал в SP, я хочу вставить в таблицу посещаемости сотрудников.

ZurdoDev

Но вы же написали хранимую процедуру, верно?

Так что вы можете делать в нем все, что захотите.

Вы можете выбрать * ...
а затем вставить в таблицу ...
а потом еще что-нибудь.

Member 12314309

Еще одна путаница заключается в том ,что если результат SP вставлен, то снова будет вставлена запись той же даты, так как ограничить дублирование записи одной и той же даты для каждого сотрудника

Member 12314309

Вставить в EmployeesAttendance
Старпома GetMachineAttendanceFinal5

ZurdoDev

Это будет работать, но вы должны поместить его в саму хранимую процедуру.

1 Ответов

Рейтинг:
5

MadMyche

Ваш SP заканчивается оператором SELECT, который возвращает значения вызывающему приложению.
(Точно так же как и вчерашний пост с просьбой обновить таблицу)

Если бы вы хотели, чтобы эти данные были вставлены в вашу таблицу, вам нужно было бы построить INSERT заявление для таблицы EmployeeAttendance.
(в отличие от заявления об обновлении, которое я написал для вас вчера)

Вам нужно будет дважды проверить сопоставления этих столбцов, я сделал все, что мог, с тем, что у вас было

INSERT EmployeeAttendance (EMPID, INTIME, OUTTIME, [HOURS], DUTY, OT, OTAmount, Late)  
select	cte.EmpID
	,	cte2.INTIME
	,	cte2.OUTTIME
	,	cte2.[Hours]
	,	CASE
			WHEN  cte2.[Hours] >= 8 THEN 1
			WHEN  cte2.[Hours] = 0 THEN 0
			WHEN  cte2.[Hours] >= 6 THEN 0.5
		END AS [Day]
	,	CASE
			WHEN  cte2.[Hours] > CTE.Dhour then  cte2.[Hours] - CTE.Dhour 
			else 0
		End as OT
	,	CASE
			when cte.OTEntitled = 'Yes'  AND cte2.[Hours] >= CTE.Dhour 	THEN (( cte2.[Hours] - 8) * 100)
				else 0
		END AS OTAMount
	,	Convert(varchar(10), cte2.INTIME,108) as [Time]
	,	Case
			When Convert(Time, cte2.INTIME,108) > cte.LTime Then 1
			else 0
		end as Late    

from cte Cross Apply Dates d 
Left Join cte2 ON cte2.EmpId= cte.EmpID AND cte2.Date=d.ReportingDate

Пожалуйста, обратите внимание
- Орден был снят, несущественно для этого
- У вас есть даты в выбранной части, но не в EmployeeAttendanceTable
- Понятия не имею, если дежурство нанесено на карту на сегодняшний день
- Тип даты не имеет "формата" для него. Хотя вы можете включить код он ничего не делает