如何获取和使用存储过程返回的值到 INSERT INTO..选择..陈述



我只是SQL语言的新手,仍在学习它。我很难寻找有关如何使用存储过程并将值插入表中的答案。

我有这个存储过程:

CREATE PROCEDURE TestID
AS
SET NOCOUNT ON; 
BEGIN
DECLARE @NewID VARCHAR(30),
@GenID INT,
@BrgyCode VARCHAR(5) = '23548'
SET @GenID = (SELECT TOP (1) NextID 
FROM dbo.RandomIDs 
WHERE IsUsed = 0 
ORDER BY RowNumber)
SET @NewID = @BrgyCode + '-' + CAST(@GenID AS VARCHAR (30))
UPDATE dbo.RandomIDs 
SET dbo.RandomIDs.IsUsed = 1
WHERE dbo.RandomIDs.NextID = @GenID
SELECT @NewID
END;

我想做的是这样的:

INSERT INTO dbo.Residents([ResidentID], NewResidentID, [ResLogdate],
...
SELECT
[ResidentID],
EXEC TestID ,
[ResLogdate],
....
FROM 
source.dbo.Resident;

有一个表dbo.RandomIDs包含随机的 6 位非重复数字,我通过存储过程提取值并将表的IsUsed列更新为 1。我正在将数据从一个数据库传输到另一个数据库,并在传输时对数据进行一些处理。处理的一部分是生成具有所需格式的新 ID。

但是我无法让它工作 可悲的是,我已经在网上搜索了几个小时,但我没有得到我需要的信息以及我写作的原因。我希望有人可以帮助我解决这个问题。

谢谢 达伦

你的问题有点令人困惑,因为你还没有解释你想做什么。当我得到你的问题时,您想从随机ids表中获取随机id,并且在对nextid执行一些处理后,您想将其插入驻留表[newresidentid]并结束从驻留表中获取数据的过程。如果我做错了什么,请随时问我。

您的过程解决方案如下。

CREATE PROCEDURE [TestId]
AS
SET NOCOUNT ON;
BEGIN
DECLARE @NEWID NVARCHAR(30)
DECLARE @GENID BIGINT
DECLARE @BRGYCODE VARCHAR(5) = '23548'
DECLARE @COUNT INTEGER
DECLARE @ERR NVARCHAR(20) = 'NO IDS IN RANDOM ID'
SET @COUNT = (SELECT COUNT(NEXTID) FROM RandomIds WHERE [IsUsed] = 0)
SET @GENID = (SELECT TOP(1) [NEXTID] FROM RandomIds WHERE [IsUsed] = 0 ORDER BY [ID] ASC)
--SELECT @GENID AS ID 
IF @COUNT = 0
BEGIN 
SELECT @ERR AS ERROR
END
ELSE
BEGIN 
SET @NEWID = @BRGYCODE + '-' + CAST(@GENID AS varchar(30))
UPDATE RandomIds SET [IsUsed] = 1 WHERE [NextId] = @GENID 
INSERT INTO Residents ([NewResidentId] , [ResLogDate] ) VALUES (@NEWID , GETDATE())
SELECT * FROM Residents
END
END

此过程将从您的 RandomIds 表中获取数据并对 NextID 执行一些处理,而不是在它直接将其插入驻留表之后,如果您想通过用户插入一些数据,您可以在声明过程名称后使用参数

例如

CREATE PROCEDURE [TESTID] 
@PARAM1 DATATYPE, 
@PARAM2 DATATYPE
AS
BEGIN 
END

我不相信你的要求是一个好的要求,但这里有一种方法可以做到这一点。

请记住,并发会话在提交更新之前将无法读取更新,因此您必须"锁定"更新,以便在要提交或回滚之前获得一个块。 这对于并发性来说是垃圾,但这是此要求的副作用。

declare @cap table ( capturedValue int);
declare @GENID  int;
update top (1) RandomIds   set IsUsed=1 
output inserted.NextID into @cap
where IsUsed=0;
set @GENID =(select max( capturedValue) from @cap )

更好的方法是使用 IDENTITY 或 SEQUENCE 来解决您的问题。 这将留下空白,但有助于并发。

最新更新