我想要完成的是为表格中的一行分配一个5位数字,并将该值与列值一起插入另一个表格。
例如,此查询返回我要分配5位随机ID的所有行:
SELECT DISTINCT(ExternalAgentId) FROM lOGS_V WHERE EXTERNALAGENTID <> ''
目前它正在返回4600
行。注意* ExternalAgentID
为varchar(50)
我需要做的是在10001
和39999
之间分配一个随机的5位数字。生成数字后,将其插入表中,并将ExternalAgentId
从上一个查询插入到另一个表中。
这是我采取的方法:
DECLARE @randAgentID int;
DECLARE @AgentID int;
DECLARE @MIN INT;
DECLARE @MAX INT;
SET @MIN = 10001
SET @MAX = 39999
SELECT @randAgentID = ROUND(((@MAX - @MIN -1) * RAND() + @MIN), 0)
SELECT @AgentID = InternalAgentID FROM VendorAgentIDs where InternalAgentID = @randAgentID
IF @AgentID is null
BEGIN
INSERT INTO VendorAgentIDs (VendorID, TRIAgentID) values (SELECT DISTINCT(ExternalAgentId) FROM LOGS_V WHERE EXTERNALAGENTID <> '', @randAgentID)
END
ELSE
BEGIN
SELECT @randAgentID = ROUND(((@MAX - @MIN -1) * RAND() + @MIN), 0)
INSERT INTO VendorAgentIDs (VendorID, TRIAgentID) values (SELECT DISTINCT(ExternalAgentId) FROM LOGS_V WHERE EXTERNALAGENTID <> '', @randAgentID)
END
正确生成随机5位数字。但是,我有两个问题:
我的syntax error
语句中有insert
。
... values(SELECT DISTINCT(ExternalAgentId)...
如果表中存在randAgentID
,则会转到ELSE
语句。我知道机会很低,但如果表中还存在下一个randAgentID
怎么办?我该如何防止这种情况?
表VendorAgentIDs
有three
列。
有关如何解决上述两个问题的任何建议?
由于
* *更新
根据建议,我编辑了我的代码。但是,我现在有violation of PRIMARY KEY
。
DECLARE @randAgentID int;
DECLARE @AgentID int;
DECLARE @MIN INT;
DECLARE @MAX INT;
SET @MIN = 10001
SET @MAX = 39999
SET @AgentID = 1
WHILE @AgentID IS NOT NULL
BEGIN
SET @AgentID = NULL
SELECT @randAgentID = ROUND(((@MAX - @MIN -1) * RAND() + @MIN), 0)
INSERT INTO VendorAgentIDs (VendorAgentID, InternalAgentID) SELECT DISTINCT(ExternalAgentId), @randAgentID FROM LOGS_V WHERE EXTERNALAGENTID <> ''
SELECT @AgentID = InternalAgentID FROM VendorAgentIDs where InternalAgentID = @randAgentID
END
违反PRIMARY KEY约束'PK_VendorAgentIDs'。无法在对象'dbo.VendorAgentIDs'中插入重复键。
答案 0 :(得分:1)
INSERT INTO VendorAgentIDs (VendorID, TRIAgentID) values (SELECT DISTINCT(ExternalAgentId) FROM TRI_PORTAL.DBO.SCREENPOPLOGS_V WHERE EXTERNALAGENTID <> '', @randAgentID)
是无效的SQL。不过我认为你可以做到
INSERT INTO VendorAgentIDs (VendorID, TRIAgentID) SELECT DISTINCT(ExternalAgentId), @randAgentID FROM TRI_PORTAL.DBO.SCREENPOPLOGS_V WHERE EXTERNALAGENTID <> ''
至于碰撞的可能性(可能性),你应该做一个循环。它变得越来越低效,但如果它必须是一个随机数而不是一个索引,那就这样吧。
SET @AgentID = 1
WHILE @AgentID is not null
BEGIN
SET @AgentID = NULL
SELECT @randAgentID = ROUND(((@MAX - @MIN -1) * RAND() + @MIN), 0)
SELECT @randAgentID -- why is this here?
SELECT @AgentID = InternalAgentID FROM VendorAgentIDs where InternalAgentID = @randAgentID
END
答案 1 :(得分:1)
可能会解决您的PK问题
INSERT INTO VendorAgentIDs
(VendorAgentID,InternalAgentID)
SELECT DISTINCT ExternalAgentId,@randAgentID
FROM LOGS_V
WHERE EXTERNALAGENTID <> ''
AND ExternalAgentId NOT IN (SELECT VendorAgentID
FROM VendorAgentIDs)