Я применил вашу идею к моему реальному миру и отлично работает в хранимой процедуре. Спасибо за это! НО мой SQL-клиент не поддерживает хранимую процедуру ... Позор мне!
Поэтому я решил создать функцию таблицы (с помощью pamareters), чтобы вызвать этот код SQL.
К сожалению, я не нашел способ использовать вашу промежуточную пронумерованную таблицу (называемую «Событие в моем использовании») ... У меня была следующая ошибка в строке «; WITH Events AS»: ==> функция не может вернуть данные клиенту.
Вот код функции я сделал:
CREATE FUNCTION fnSensorsDesactivations
(
@dateStartInString nvarchar(50) = '',
@dateEndInString nvarchar(50) = '',
@Unit nvarchar(50) = null,
@HoursToAddFromGMT int = -2,
@DesactivationEventsFilter nvarchar(50) = 'Validation et Désactivation%',
@BeforeDesactivationComment nvarchar(50) = 'Validation et Désactivation Capteur par ',
@AfterDesactivationComment nvarchar(50) = '. Commentaire : ',
@ActivationEventsFilter nvarchar(50) = 'Activation Capteur par%',
@BeforeActivationUsername nvarchar(50) = 'Activation Capteur par '
)
RETURNS @TableTempToReturn TABLE
(
-- Add the column definitions for the TABLE variable here
--Ord int,
Unit nvarchar(50),
Module nvarchar(255),
Module_Description nvarchar(255),
DésactivationQui nvarchar(255),
DésactivationDateTime nvarchar(255),
DésactivationMessage nvarchar(255),
ActivationQui nvarchar(255),
ActivationDateTime nvarchar(255)
)
AS
BEGIN
DECLARE @ExcludeOrds AS nvarchar(255) -- Must be comma separated and also at first and last character
DECLARE @dateStart AS datetime -- to cast datetime from string because Dream Report is not able to pass parameters with formulas
DECLARE @dateEnd AS datetime -- to cast datetime from string because Dream Report is not able to pass parameters with formulas
SET @ExcludeOrds=',,,,,,,,,'
IF @dateStartInString='' OR @dateEndInString=''
BEGIN
--Init dates from yesterday to today if they are null
SET @dateEnd=GETDATE()
SET @dateStart=DATEADD(year, -1, @DateEnd)
END
ELSE
BEGIN
--Convert datetime from string to datetime format + hours from GMT to follow local datetime settings
SET @dateEnd=DATEADD(hour, @HoursToAddFromGMT, CONVERT(datetime, @dateEndInString, 121))
SET @dateStart=DATEADD(hour, @HoursToAddFromGMT, CONVERT(datetime, @dateStartInString, 121))
END
IF @Unit IS NULL SET @Unit='WIP-BC2'
--Calculate positions/orders of differents Activation and desactivation events
;WITH Events AS -- Here is my SQL error: select statements included whithin a function cannot return a data to a client.
(
SELECT Ord, Unit, Module, Module_Description, Desc2, Date_Time,
ROW_NUMBER() OVER (ORDER BY Unit, Module, Ord) AS rn
FROM
EJournal.dbo.Journal
WHERE
Date_Time <= @dateEnd
AND Unit = @Unit
AND (Desc2 like @DesactivationEventsFilter
OR Desc2 like @ActivationEventsFilter)
--AND (Date_Time like @ActivationEventsFilter and Date_Time<[email protected])
AND CHARINDEX(CAST(Ord AS nvarchar), @ExcludeOrds,1)=0
)
--Depending on desactivation and activation orders, select good Events in Activation/descativation columns
SELECT
--n1.Ord,n2.Ord, n1.Desc2, n2.Desc2,
n1.Module
, n1.Module_Description
, CASE
WHEN n1.Desc2 like @ActivationEventsFilter AND n2.Desc2 like @ActivationEventsFilter
THEN ''
WHEN n1.Desc2 like @DesactivationEventsFilter AND (n2.Desc2 like @ActivationEventsFilter OR n2.Ord IS NULL)
THEN ISNULL(LEFT(SUBSTRING(n1.Desc2, LEN(@BeforeDesactivationComment)+2, 255)
, CHARINDEX(@AfterDesactivationComment, SUBSTRING(n1.Desc2, LEN(@BeforeDesactivationComment)+2, 255)) - 1), '')
WHEN n1.Desc2 like @DesactivationEventsFilter AND (n2.Desc2 like @DesactivationEventsFilter OR n2.Ord IS NULL)
THEN ISNULL(LEFT(SUBSTRING(n1.Desc2, LEN(@BeforeDesactivationComment)+2, 255), '')
, CHARINDEX(@AfterDesactivationComment, SUBSTRING(n1.Desc2, LEN(@BeforeDesactivationComment)+2, 255)) - 1)
ELSE ''
END AS DésactivationQui
, CASE
WHEN n1.Desc2 like @ActivationEventsFilter AND n2.Desc2 like @ActivationEventsFilter
THEN ''
WHEN n1.Desc2 like @DesactivationEventsFilter AND (n2.Desc2 like @ActivationEventsFilter OR n2.Ord IS NULL)
THEN ISNULL(CONVERT(nvarchar, n1.Date_Time, 121), '')
WHEN n1.Desc2 like @DesactivationEventsFilter AND (n2.Desc2 like @DesactivationEventsFilter OR n2.Ord IS NULL)
THEN ISNULL(CONVERT(nvarchar, n1.Date_Time, 121), '')
ELSE ''
END AS DésactivationDateTime
, CASE
WHEN n1.Desc2 like @ActivationEventsFilter AND n2.Desc2 like @ActivationEventsFilter
THEN ''
WHEN n1.Desc2 like @DesactivationEventsFilter AND (n2.Desc2 like @ActivationEventsFilter OR n2.Ord IS NULL)
THEN ISNULL(SUBSTRING(n1.Desc2, CHARINDEX(@AfterDesactivationComment, n1.Desc2)+LEN(@AfterDesactivationComment), 255) , '')
WHEN n1.Desc2 like @DesactivationEventsFilter AND (n2.Desc2 like @DesactivationEventsFilter OR n2.Ord IS NULL)
THEN ISNULL(SUBSTRING(n1.Desc2, CHARINDEX(@AfterDesactivationComment, n1.Desc2)+LEN(@AfterDesactivationComment), 255) , '')
ELSE ''
END AS DésactivationMessage
, CASE
WHEN n1.Desc2 like @ActivationEventsFilter AND n2.Desc2 like @ActivationEventsFilter
THEN ISNULL(SUBSTRING(n2.Desc2, LEN(@BeforeActivationUsername)+2, 255),'')
WHEN (n1.Desc2 like @DesactivationEventsFilter OR n1.Ord IS NULL) AND n2.Desc2 like @ActivationEventsFilter
THEN ISNULL(SUBSTRING(n2.Desc2, LEN(@BeforeActivationUsername)+2, 255), '')
--WHEN n1.Desc2 like @DesactivationEventsFilter AND n2.Desc2 like @DesactivationEventsFilter THEN ''
-- THEN ''
ELSE ''
END AS ActivationQui
, CASE
WHEN n1.Desc2 like @ActivationEventsFilter AND n2.Desc2 like @ActivationEventsFilter
THEN ISNULL(CONVERT(nvarchar, n2.Date_Time, 121),'')
WHEN (n1.Desc2 like @DesactivationEventsFilter OR n1.Ord IS NULL) AND n2.Desc2 like @ActivationEventsFilter
THEN ISNULL(CONVERT(nvarchar, n2.Date_Time, 121),'')
--WHEN n1.Desc2 like @DesactivationEventsFilter AND n2.Desc2 like @DesactivationEventsFilter
-- THEN ''
ELSE ''
END AS ActivationDateTime
FROM
Events n1
FULL OUTER JOIN
Events n2
ON n1.rn = n2.rn - 1
AND n1.Unit=n2.Unit
AND n1.Module=n2.Module
WHERE NOT (n1.Desc2 like @ActivationEventsFilter AND n2.Desc2 like @DesactivationEventsFilter)
AND n1.Desc2 like @DesactivationEventsFilter
AND n1.Date_Time <= @dateEnd
--AND n2.Date_Time <= @dateEnd
AND (n2.Ord IS NULL OR n2.Date_Time>[email protected])
RETURN
END
ли у Вас есть волшебное решение для этого?
Еще раз спасибо за помощь! François
Отлично! Спасибо за этот ответ! Было ли у вас решение иметь только один SELECT с ROW_NUMBER()? Я не уверен, что мой последний SQL-клиент позволит такие запросы ... Что бы ни звучало, звучит хорошо! :) – Francois