如何获取和使用存储过程返回的值到INSERT INTO ... SELECT ...语句

时间:2018-06-05 02:56:39

标签: sql-server stored-procedures

我只是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。

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

谢谢, 达伦

2 个答案:

答案 0 :(得分:0)

你的问题有点令人困惑,因为你没有解释你想做什么。当我得到你的问题时,你想从randomids表中获取随机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上执行一些处理,而不是在它将其插入驻留表之后,如果要通过用户插入一些数据,则可以在声明过程名称后使用参数

E.G

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

 END

答案 1 :(得分:0)

我不相信你的要求是好的,但这是一种方法。

请记住,并发会话在提交之前将无法读取您的更新,因此您必须“锁定”更新,这样您才能获得阻止,直到您要提交或回滚为止。这对于并发来说是垃圾,但这是这个要求的副作用。

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来解决您的问题。这会留下空白但有助于并发。