Как передать значение в переменную даты в части подзапроса, используя предложение where - PullRequest
0 голосов
/ 03 июня 2019

Я бы хотел как-то контролировать объявленную переменную с помощью предложения where.

У меня есть пример запроса, подобный этому:

DECLARE @dateplaceholder AS DATETIME
SET @dateplaceholder = '2019-06-01'
SELECT @dateplaceholder PLACEHOLDER_DATE, GETDATE() AS TODAY, SOME_DATE_AGO = (SELECT dateadd(DAY, -7, @dateplaceholder ))

GO

Это будет работать как задумано. Дать следующий результат:

enter image description here

Теперь я хочу контролировать переменную @dateplaceholder в предложении where, чтобы сделать мой запрос, представление, которое я могу вызвать:

select * myqueryView where @dateplaceholder = '2018-01-01'

Примерно так:

DECLARE @dateplaceholder AS DATETIME
SET @dateplaceholder = '2019-06-01'
SELECT @dateplaceholder PLACEHOLDER_DATE, GETDATE() AS TODAY, SOME_DATE_AGO = (SELECT dateadd(DAY, -7, @dateplaceholder ))
WHERE SELECT @dateplaceholder = '2018-01-01'
GO

Тем не менее, он не вернет никаких результатов, так как в основном проверяет, что объявленная переменная имеет это значение в предложении where, он не будет set it.

Как это можно решить?

1 Ответ

1 голос
/ 03 июня 2019

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

CREATE FUNCTION  [YourQueryName]
(@dateplaceholder datetime)
RETURNS TABLE
AS
RETURN
SELECT 
    @dateplaceholder PLACEHOLDER_DATE, 
    GETDATE() AS TODAY, 
    SOME_DATE_AGO = (SELECT dateadd(DAY, -7, @dateplaceholder ))
GO

DECLARE @dateplaceholder AS DATETIME
SET @dateplaceholder = '2018-01-01'

select * from [YourQueryName](@dateplaceholder)

Если вы предпочитаете, вы также можете использовать StoredProcedure следующим образом:

CREATE PROCEDURE [usersp_YourQueryName] @dateplaceholder AS datetime
AS
BEGIN

    SELECT @dateplaceholder PLACEHOLDER_DATE, GETDATE() AS TODAY, SOME_DATE_AGO = (SELECT dateadd(DAY, -7, @dateplaceholder ))
END
GO

EXEC [usersp_YourQueryName] '2019-06-01'
...