SQL从函数插入SELECT会返回相同的值

时间:2018-10-24 09:15:15

标签: sql sql-server user-defined-functions

我有以下函数,该函数根据@Date月份返回新代码

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 :(得分:2)

我不确定这是否是您问题的答案,也不知道这是否是最好的方法,但是我认为这可能会解决您的问题。只需为每个选定的行生成值(使用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

答案 1 :(得分:0)

由于您使用Table2's Date列在表1中插入数据,因此只需检查表2中不同月份的日期值即可。您的功能将完美地适用于每一行。