SQL 服务器插入:使用静态值确定日期值
SQL Server insert: using a static value to determine date value
我正在将生产订单插入 SQL 服务器数据库,其中包含一个通过 Microsoft PowerApps 调用的存储过程。目前,构建日期列仅使用今天的日期作为构建日期。下面附上记录样本:
如您所见,所有这 10 个订单都将今天的日期作为设置的构建日期。但是,我想根据当天的必要输出动态设置此构建日期。这很可能将一个变量传递给存储过程。例如 - 如果构建输出为每天 5 个,则第 1-5 行的构建日期为“02/17/2020”,而接下来的 5 行的构建日期为“02/18/2020”。
这很简单,因为订单数可以被构建输出整除。但是,假设构建输出是 3 而不是 5。前三个订单为“02/17/2020”,接下来的三个订单为“02/18/2020”,接下来的三个订单为“02/19” /2020'。这将留下一个订单设置为“02/20/2020”。然后,如果我添加更多订单,它会在每个日期叠加,每个日期最多填充 3 个。有没有办法通过存储过程来做到这一点?
您可能需要做一些调整,但根据我的理解,这可以解决问题([Date] 是上面示例 table 中的日期列):
CREATE PROC yourProcName @pNUM AS INT = 1 --PARAMETER
AS
(
DECLARE @pDate DATE;
SET @pDate = COALESCE((SELECT TOP 1 CONVERT(DATE, MAX([Date])), GETDATE()) FROM yourDestTable); --SETTING THE DATE AS MAX DATE ALREADY EXISTS IN THE TABLE. IF NOTHING IS THERE, WE'LL USE TODAY
DECLARE @pLead INT = COALESCE((SELECT TOP 1 COUNT(*) FROM yourDestTable WHERE [Date] = @pDate), 0);--SEE HOW MANY RECORDS IN THE DATABASE EXIST WITH THE DATE WE DEFINED
WITH cte
AS
(
SELECT *,
FLOOR((
ROW_NUMBER() OVER(ORDER BY @pDate) -
0.001)/@pNUM) AS RN -- SEPARATING RECORDS USING ROW_NUMBER DIVIDED BY DEFINED NUMBER OF PRODS PER DAY. USING FLOOR AND MINUS A SMALL AMOUNT TO ROUND IT RIGHT
FROM yourSourceTable
)
INSERT INTO yourDestTable
SELECT
C.*,
DATEADD(DAY, LEAD(C.RN, @pLead), @pDate) AS [Date] --PUSHING THE NUMBER BASED ON ROWS ALREADY EXISTED WITH THE MAX_DATE
INTO yourDestTable
FROM cte AS C
)
您可能希望根据您的用例在 CTE 中使用 MOD。但这个想法应该可行。然后这样称呼它EXEC yourProcName <number of transactionsday>
我正在将生产订单插入 SQL 服务器数据库,其中包含一个通过 Microsoft PowerApps 调用的存储过程。目前,构建日期列仅使用今天的日期作为构建日期。下面附上记录样本:
如您所见,所有这 10 个订单都将今天的日期作为设置的构建日期。但是,我想根据当天的必要输出动态设置此构建日期。这很可能将一个变量传递给存储过程。例如 - 如果构建输出为每天 5 个,则第 1-5 行的构建日期为“02/17/2020”,而接下来的 5 行的构建日期为“02/18/2020”。
这很简单,因为订单数可以被构建输出整除。但是,假设构建输出是 3 而不是 5。前三个订单为“02/17/2020”,接下来的三个订单为“02/18/2020”,接下来的三个订单为“02/19” /2020'。这将留下一个订单设置为“02/20/2020”。然后,如果我添加更多订单,它会在每个日期叠加,每个日期最多填充 3 个。有没有办法通过存储过程来做到这一点?
您可能需要做一些调整,但根据我的理解,这可以解决问题([Date] 是上面示例 table 中的日期列):
CREATE PROC yourProcName @pNUM AS INT = 1 --PARAMETER
AS
(
DECLARE @pDate DATE;
SET @pDate = COALESCE((SELECT TOP 1 CONVERT(DATE, MAX([Date])), GETDATE()) FROM yourDestTable); --SETTING THE DATE AS MAX DATE ALREADY EXISTS IN THE TABLE. IF NOTHING IS THERE, WE'LL USE TODAY
DECLARE @pLead INT = COALESCE((SELECT TOP 1 COUNT(*) FROM yourDestTable WHERE [Date] = @pDate), 0);--SEE HOW MANY RECORDS IN THE DATABASE EXIST WITH THE DATE WE DEFINED
WITH cte
AS
(
SELECT *,
FLOOR((
ROW_NUMBER() OVER(ORDER BY @pDate) -
0.001)/@pNUM) AS RN -- SEPARATING RECORDS USING ROW_NUMBER DIVIDED BY DEFINED NUMBER OF PRODS PER DAY. USING FLOOR AND MINUS A SMALL AMOUNT TO ROUND IT RIGHT
FROM yourSourceTable
)
INSERT INTO yourDestTable
SELECT
C.*,
DATEADD(DAY, LEAD(C.RN, @pLead), @pDate) AS [Date] --PUSHING THE NUMBER BASED ON ROWS ALREADY EXISTED WITH THE MAX_DATE
INTO yourDestTable
FROM cte AS C
)
您可能希望根据您的用例在 CTE 中使用 MOD。但这个想法应该可行。然后这样称呼它EXEC yourProcName <number of transactionsday>