插入带有随机生成数字的语句

时间:2014-10-27 21:52:14

标签: sql-server sql-server-2008 sql-insert

我想要完成的是为表格中的一行分配一个5位数字,并将该值与列值一起插入另一个表格。

例如,此查询返回我要分配5位随机ID的所有行:

SELECT DISTINCT(ExternalAgentId) FROM lOGS_V WHERE EXTERNALAGENTID <> ''

目前它正在返回4600行。注意* ExternalAgentIDvarchar(50)

我需要做的是在1000139999之间分配一个随机的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位数字。但是,我有两个问题:

  1. 我的syntax error语句中有insert

      

    ... values(SELECT DISTINCT(ExternalAgentId)...

  2. 如果表中存在randAgentID,则会转到ELSE语句。我知道机会很低,但如果表中还存在下一个randAgentID怎么办?我该如何防止这种情况?

  3. VendorAgentIDsthree列。

    • ID(自动增量)
    • VendorID(varchar(50))
    • InternalAgentID(PK,int)

    有关如何解决上述两个问题的任何建议?

    由于

    * *更新

    根据建议,我编辑了我的代码。但是,我现在有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'中插入重复键。

2 个答案:

答案 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)