Member 13674721 Ответов: 1

Генерация отчета о посещаемости в SQL, где задается идентификатор пользователя


Я генерирую отчет о посещаемости в sql .у меня есть этот запрос здесь, который позволяет выбрать дату начала и дату окончания и создать отчет обо всех идентификаторах пользователей в моей таблице .Но теперь я хочу, чтобы он отображал его только для определенного идентификатора пользователя. Итак, как мне передать идентификатор пользователя в качестве параметра в моей хранимой процедуре??

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


<pre>USE [first_db]
GO

/****** Object:  StoredProcedure [dbo].[GET_ATTENDANCE]    Script Date: 25-02-2018 14:30:07 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[GET_ATTENDANCE]
@STARTDATE  DATETIME,
@ENDDATE    DATETIME
AS BEGIN

--Now generate dates between two dates by Common table expression . and store that values in one temporary table (#TMP_DATES) .
;WITH DATERANGE  AS
(
  SELECT DT =DATEADD(DD,0, @STARTDATE)
  WHERE DATEADD(DD, 1, @STARTDATE) <= @ENDDATE
  UNION ALL
  SELECT DATEADD(DD, 1, DT)
  FROM DATERANGE
  WHERE DATEADD(DD, 1, DT) <= @ENDDATE
)
SELECT * INTO #TMP_DATES
FROM DATERANGE


--As the Report columns (Dates) are dynamic ,  hence Columns (Dates) are concatenated   one by one  from Temporary table (#TMP_DATES) and store the value in a local variable . 
DECLARE @COLUMN VARCHAR(MAX)
SELECT @COLUMN=ISNULL(@COLUMN+',','')+ '['+ CAST(CONVERT(DATE , T.DT) AS VARCHAR) + ']'  FROM #TMP_DATES T

--After Pivot , some columns may be Null as data (here PRESENT_STATUS) not exists in pivot section    .Now  replace the Null values by 'N/A'  .

DECLARE @Columns2 VARCHAR(MAX)
SET @Columns2 = SUBSTRING((SELECT DISTINCT ',ISNULL(['+ CAST(CONVERT(DATE , DT) as varchar )+'],''A'') AS ['+CAST(CONVERT(DATE , DT) as varchar )+']' FROM #TMP_DATES GROUP BY dt FOR XML PATH('')),2,8000)

--Now declare one local variable to write the dynamic sql query .
DECLARE @QUERY VARCHAR(MAX)

--Here Right outer join is done to show the all dates from the temporary table

SET @QUERY = 'SELECT User_Id, ' + @Columns2  +' FROM
            (
                  SELECT  A.User_Id , B.DT AS DATE, A.STATUS FROM MarkA A RIGHT OUTER  JOIN #TMP_DATES B ON A.DATE=B.DT              
           ) X
            PIVOT
            (
                 MIN([STATUS])
                 FOR [DATE] IN (' + @COLUMN + ')
            ) P
            WHERE ISNULL(User_Id,'''')<>''''
            '

 EXEC (@QUERY)

 --Drop the  temporary table
      DROP TABLE #TMP_DATES
     
 END

GO

1 Ответов

Рейтинг:
2

OriginalGriff

Добавьте параметр user id к существующим двум между процедурой CREATE (или, что более вероятно, вместо этого вам понадобится оператор ALTER PROCEDURE) и строками AS BEGIN:

CREATE PROCEDURE [dbo].[GET_ATTENDANCE]
@STARTDATE  DATETIME,
@ENDDATE    DATETIME,
@USERID     INT
AS BEGIN
(Используйте соответствующий тип данных для вашего идентификатора пользователя, я не знаю, что это за тип)

Затем, вероятно, измените код таблицы, чтобы генерировать только необходимую информацию о пользователе:
SELECT * INTO #TMP_DATES
FROM DATERANGE
WHERE UserID = @USERID


Но, честно говоря, если вы не можете решить это для себя после написания такого сложного SP, то вам нужно освежить основы SQL, потому что просто копировать код из интернета, не понимая его вообще, не очень хорошая идея! И сдавать его как свою собственную работу ... это плагиат, и ваш наставник, вероятно, очень хорошо это распознает ...


Member 13674721

Показывает ошибку необходимо объявить скалярную переменную "@USERID"

OriginalGriff

И что же?
Вы объявили об этом, как я сказал?
Вы передали его в SQL, когда вызвали SP?

Member 13674721

да заявил Я
а также передал его в SQL

OriginalGriff

Показать код: используйте SSMS для копирования вашего SP в буфер обмена, а также покажите код, который вы использовали для его вызова в вашем программном обеспечении презентации

Member 13674721

если я помещаю предложение where в #temp, то он говорит недопустимое имя столбца User_Id

Member 13674721

Используйте [first_db]
ГО

/****** Объект: StoredProcedure [dbo].[STUD_ATT] Дата написания сценария: 25-02-2018 18:33:02 ******/
УСТАНОВИТЕ ANSI_NULLS НА
ГО

УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ГО


-- =============================================
-- Автор: <автор,,имя>
-- Дата создания: <дата создания,,>
-- Описание: <описание,,>
-- =============================================
Изменить процедуру [dbo].[STUD_ATT]
@STARTDATE DATETIME,
@ENDDATE DATETIME,
@ИДЕНТИФИКАТОР ПОЛЬЗОВАТЕЛЯ ТИП ДАННЫХ BIGINT

КАК НАЧАТЬ

--Теперь генерируйте даты между двумя датами по общему табличному выражению . и сохраните эти значения в одной временной таблице (#TMP_DATES) .
;С ПЕРИОДА КАК
(
ВЫБЕРИТЕ DT =DATEADD(DD,0, @STARTDATE)
Где DATEADD(DD, 1, @STARTDATE) <= @ENDDATE
СОЮЗ ВСЕХ
ВЫБЕРИТЕ DATEADD(DD, 1, DT)
ОТ ПЕРИОДА
Где DATEADD(DD, 1, DT) <= @ENDDATE
)
ВЫБЕРИТЕ * В #TMP_DATES
ОТ ПЕРИОДА
где User_Id=@USERID


--Поскольку столбцы отчета (даты) являются динамическими , следовательно, столбцы (даты) объединяются один за другим из временной таблицы (#TMP_DATES) и хранят значение в локальной переменной .
ОБЪЯВИТЬ @COLUMN VARCHAR(MAX)
Выберите столбец @=функция isnull(@столбца+',',")+ '['+ приведение(преобразование(даты , т. ДТ) как varchar) + ']' от #TMP_DATES Т

--После Pivot некоторые столбцы могут быть пустыми , так как данные (здесь PRESENT_STATUS) не существуют в разделе pivot .Теперь замените нулевые значения на 'N/A' .

Объявить @Columns2 VARCHAR(макс.)
Набор @Columns2 = подстрока((выбрать различные ',функция isnull(['+ литые(конвертации(дата , ДТ) как varchar )+'],"а") как ['+литые(конвертации(дата , ДТ) как varchar )+']' от #TMP_DATES группы по ДТ для XML путь(")),2,8000)

--Теперь объявите одну локальную переменную для записи динамического sql-запроса .
DECLARE @QUERY VARCHAR(MAX)

--Здесь делается правое внешнее соединение, чтобы показать все даты из временной таблицы

SET @QUERY = 'SELECT User_Id,' + @Columns2 +' FROM
(
Выберите А. Ид_пользователя , Б. ДТ как дата, статус А. от Марка правое внешнее соединение #TMP_DATES B на сегодняшний день А.=Б.DT
) Икс
СТЕРЖЕНЬ
(
MIN([СТАТУС])
ДЛЯ [ДАТЫ] В (' + @COLUMN + ')
) П
Где ISNULL(User_Id,"")<>""
'

EXEC (@QUERY)

--Отбросьте временную таблицу
DROP TABLE #TMP_DATES

КОНЕЦ


ГО