Не удалось найти хранимую процедуру ISDATE - PullRequest
1 голос
/ 15 марта 2019

Ниже приведена функция, из того, что я вижу, нет ошибок, но когда я пытаюсь ее построить, я получаю ошибку «Не удалось найти хранимую процедуру ISDATE»

На второй ноте, если в любом случае естьЛучшее решение моей проблемы, чем моя логика здесь, пожалуйста, дайте мне знать.

Требуется иметь базовый день и добавлять этот день каждый месяц для обозначения диапазона.Проблема возникает, если базовый день 29, 30 или 31 и февраль наступает, вы получите сообщение об ошибке SQL, в котором говорится, что это недопустимая дата.Цель этой функции состоит в том, чтобы взять три части даты и попытаться сделать верную дату для возврата.

CREATE FUNCTION Configuration.CreateDate
(
    @Year INT,
    @Month INT,
    @Day INT
)
RETURNS DATE
AS
BEGIN
    DECLARE @ReturnDate DATE

    DECLARE @DateString varchar
    DECLARE @VaildDate INT = 0;

    WHILE @VaildDate = 0
        BEGIN 
            SET @DateString = CAST(@Year AS VARCHAR(4)) + '-' +CAST(@Month AS VARCHAR(4)) + '-' + CAST(@Day AS VARCHAR(4))

            IF ISDATE(@DateString) = 1
                SET @ReturnDate = CAST(@DateString AS DATE)
                SET @VaildDate = 1
            ELSE 
                SET @Day = @Day - 1
        END

    RETURN @ReturnDate

END
GO

1 Ответ

1 голос
/ 15 марта 2019
IF ISDATE(@DateString) = 1

для замены на:

IF TRY_CAST(@DateString AS DATE) IS NOT NULL

Скорректированный DDL всей функции:

CREATE FUNCTION Configuration.CreateDate
(
    @Year INT,
    @Month INT,
    @Day INT
)
RETURNS DATE
AS
BEGIN
    DECLARE @ReturnDate DATE

    DECLARE @DateString varchar
    DECLARE @VaildDate INT = 0;

    WHILE @VaildDate = 0
        BEGIN 
            SET @DateString = CAST(@Year AS VARCHAR(4)) + '-' +CAST(@Month AS VARCHAR(4)) + '-' + CAST(@Day AS VARCHAR(4))

            IF TRY_CAST(@DateString AS DATE) IS NOT NULL
            BEGIN
                SET @ReturnDate = CAST(@DateString AS DATE)
                SET @VaildDate = 1
            END
            ELSE 
                SET @Day = @Day - 1
        END

    RETURN @ReturnDate

END

На второй ноте, если в любом случае есть какое-либо лучшее решениепожалуйста, дайте мне знать, а не мою логику.

Не используйте скалярные функции для таких целей вообще.Если такую ​​логику действительно необходимо инкапсулировать в какую-то функцию, выберите встроенный тип UDF, но не скалярный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...