我正在將資料從一個表復制到另一個表,在復制程序中我添加了一個自動生成的數字。
以下查詢是每天運行的作業,用于將特定日期的發票添加到表中。
insert into dbo.tblabc (InvoiceNumber, AgentId)
select [dbo].[udf_GetInvoiceNumber](AgentId),AgentId from dbo.tblxyz
該函式[dbo].[udf_GetInvoiceNumber](cd.AgentId)根據已經可用的代理回傳 InvoiceNumber。
//功能
ALTER function [dbo].[udf_GetInvoiceNumber](@AgentId int)
returns varchar(50)
begin
DECLARE @JC varchar(50) = 0
if exists(SELECT count(agentid) from dbo.tblabc where AgentId = @AgentId and year(CreatedDate) = year(getdate()) group by agentid)
begin
Set @JC = (SELECT count(agentid) from dbo.tblabc where AgentId = @AgentId and year(CreatedDate) = year(getdate()) group by agentid)
end
Set @JC = (Select concat('ALD/SHJ/',year(getdate()),'/INV/000', @JC 1))
return @JC
end
現在,這不起作用,InvoiceNumber當同時添加多行時,只會更新一行。
任何其他方式來實作這一目標?
uj5u.com熱心網友回復:
您在這里面臨的挑戰是因為功能。該函式始終檢查資料庫中已有的值并為您生成發票編號。因此,當您要從源插入 2 行或更多行時,目標仍保留相同數量的行,因此它將為所有行回傳相同的 ID。所以要克服這個問題,請嘗試在 Functions 之外生成發票編號。也許嘗試使用以下方法
;WITH CTE
AS
(
SELECT
AgentId,
YearCount = COUNT(1)
FROM dbo.YourTable
WHERE YEAR(CreatedDate) = YEAR(GETDATE())
GROUP BY
AgentId
)
INSERT INTO dbo.DestinationTable
(
InvoiceNumber,
AgentId
)
SELECT
InvoiceNumber = concat('ALD/SHJ/',year(GETDATE()),'/INV/000', ROW_NUMBER() OVER(PARTITION BY AgentId ORDER BY AgentId ) ISNULL(CTE.YearCount,0) 1), --Generate ID without a function which will be much faster also
AgentId = SRC.AgentId
FROM SourceTable SRC
LEFT JOIN CTE
ON SRC.AgentId = cte.AgentId
uj5u.com熱心網友回復:
您將如何執行查詢并不重要。我想,可能是你的功能有問題。所以,我在這里為您制作了一個簡單的函式和示例。
假設您有以下標量函式,您必須在其中添加 1 和傳遞的 AgentId。所以代碼如下。
CREATE FUNCTION udf_GetInvoiceNumber
(
@AgentId int
)
RETURNS int
AS
BEGIN
RETURN @AgentId 1
END
GO
選擇和插入查詢將保留在您發布時,它在下面。它回傳多行。
INSERT INTO dbo.tblabc (InvoiceNumber, AgentId)
SELECT [dbo].[udf_GetInvoiceNumber](cd.Id),cd.Id
FROM dbo.tblxyz cd
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/340094.html
標籤:sql sql-server 查询语句
