2014-10-27 56 views
0

我想要完成的是將5位數字分配給表中的一行,並將該值與列值一起插入到不同的表中。用隨機生成的數字插入語句

例如,該查詢返回的一切,我想分配一個5位隨機ID行:

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

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

我需要做的是分配一個隨機的5位數字在1000139999之間。一旦我生成的數字插入到表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. 我在insert語句syntax error

    ...值(SELECT DISTINCT(ExternalAgentId)...

  2. 如果存在於表中的randAgentID,它進入了ELSE聲明。我知道機會是低,但什麼如果未來randAgentID表中也存在?如何防止?

VendorAgentIDsthree列。

  • ID(自動增量)
  • 廠商ID(VARCHAR(50))
  • InternalAgentID(PK,INT)

我如何能解決以上兩個問題有什麼建議?

感謝

* UPDATE

基礎上的建議,我編輯我的代碼。但是,我現在有一個violation of PRIMARY KEY。 PRIMARY KEY約束 'PK_VendorAgentIDs' 的

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 

衝突。無法在對象'dbo.VendorAgentIDs'中插入重複鍵。

+0

。你可以改爲'INSERT..FROM'。你應該閱讀關於'INSERT'的相關MSDN文章。 – Yuck 2014-10-27 21:54:18

回答

1

可能是當你使用`VALUES`你必須硬編碼,或使用動態SQL,這將解決您的PK問題

INSERT INTO VendorAgentIDs 
      (VendorAgentID,InternalAgentID) 
SELECT DISTINCT ExternalAgentId,@randAgentID 
FROM LOGS_V 
WHERE EXTERNALAGENTID <> '' 
     AND ExternalAgentId NOT IN (SELECT VendorAgentID 
            FROM VendorAgentIDs) 
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 
+0

'SELECT @randAgentID - 爲什麼在這裏?'Ups。我正在進行測試,並忘記刪除該線。我會立即測試您的解決方案,並讓您知道結果。謝謝。 – smr5 2014-10-27 22:17:15

+0

我已更新我的帖子。我使用了你的建議,但是,我在該表中獲得了「違反主鍵」的情況。有什麼建議麼? – smr5 2014-10-27 22:40:17

+0

您需要將插入移動到循環之後,因此,只有具有不存在的randAgentID時纔會插入新記錄。 Nostromoo建議您開始循環,然後生成randAgentID,然後嘗試從數據庫中選擇它。如果您沒有爲新生成的randAngentID找到AgentID,則表示它以前沒有使用過,然後可以插入新的代理。 – Trent 2014-10-28 02:18:01