我有以下函数,该函数根据@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
如何使此函数对每行而不是对每个查询求值?
谢谢。
答案 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中不同月份的日期值即可。您的功能将完美地适用于每一行。