SQL вставка в SELECT из функции возвращает то же значение - PullRequest
0 голосов
/ 24 октября 2018

У меня есть следующая функция, которая возвращает новый код на основе Месяца @ Дата

CREATE FUNCTION [dbo].[NewCode](@Date date)
    RETURNS nvarchar(4) AS
    BEGIN
    DECLARE @LastCode nvarchar(4);
    SET @LastCode = (SELECT MAX(Code) FROM TABLE1 WHERE MONTH(TDate) = MONTH(@Date))
    IF @LastCode IS NULL
        SET @LastCode = '0001';
    ELSE
        BEGIN
            SET @LastCode = CONVERT(nvarchar,(CONVERT(int, @LastCode) + 1));
            WHILE LEN(@LastCode) < 4
                BEGIN
                    SET @LastCode = '0' + @LastCode;
                END
        END

            RETURN @LastCode;
    END

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

INSERT INTO Table1 SELECT T1, T2, T3, dbo.NewCode(Table2.TDate) FROM Table2

Как сделать так, чтобы эта функция вычисляла оценки для каждой строки, а не для запроса?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

, так как вы используете столбец Table2's Date для вставки данных в Таблицу1, просто убедитесь, что в таблице 2 должно быть указано значение даты для разных месяцев.Ваша функция будет отлично работать для каждого ряда.

0 голосов
/ 24 октября 2018

Я не уверен, что это именно ответ на ваш вопрос, и я не знаю, является ли это наилучшим из возможных подходов, но я думаю, что это может решить вашу проблему.Просто сгенерируйте значение для каждой выбранной строки (используя ROW_NUMBER()) и добавьте это значение в результат вашей функции.Функция изменена и возвращает целочисленное значение.

CREATE FUNCTION [dbo].[NewCode] (
    @Date date
)
RETURNS numeric(4, 0) AS
BEGIN
    DECLARE @LastCode numeric(4, 0);
    SET @LastCode = (SELECT MAX(Code) FROM TABLE1 WHERE MONTH(TDate) = MONTH(@Date))
    IF @LastCode IS NULL 
        SET @LastCode = 1;
    ELSE
        SET @LastCode = CONVERT(int, @LastCode) + 1;
    RETURN @LastCode;
END

INSERT INTO Table1 
SELECT 
    T1, T2, T3, 
    RIGHT('0000' + CAST(dbo.NewCode(Table2.TDate) + ROW_NUMBER() OVER (ORDER BY T1) - 1 AS varchar(4)), 4)
    FROM Table2
...