我只是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。
但我无法让它工作悲伤我已经在网上搜索了好几个小时但是我没有得到我需要的信息以及我写作的原因。我希望有人可以帮助我。
谢谢, 达伦
答案 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来解决您的问题。这会留下空白但有助于并发。