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