2015-04-20 68 views
0

我有一個表ABSENCE,其中有40個員工ID,需要從表變量中添加兩列作爲參考表。對於每個emp id,我需要從表變量中隨機分配值。下面是我嘗試沒有隨機代碼:將隨機文本插入參考表變量的列中

USE TSQL2012; 
GO 
DECLARE @MAX SMALLINT; 
DECLARE @MIN SMALLINT; 
DECLARE @RECODE SMALLINT; 
DECLARE @RE CHAR(100); 

DECLARE @rearray table (recode smallint,re char(100)); 
insert into @rearray values (100,'HIT BY BEER TRUCK') 
,(200,'BAD HAIR DAY') 
,(300,'ASPIRIN OVERDOSE') 
,(400,'MAKEUP DISASTER') 
,(500,'GOT LOCKED IN THE SALOON') 

DECLARE @REFCURSOR AS CURSOR; 
SET @REFCURSOR = CURSOR FOR 
SELECT RECODE,RE FROM @REARRAY; 
OPEN @REFCURSOR; 

SET @MAX = (SELECT DISTINCT @@ROWCOUNT FROM ABSENCE); 
SET @MIN = 0; 
ALTER TABLE ABSENCE ADD CODE SMALLINT, REASONING CHAR(100); 

WHILE (@MIN <= @MAX) 
BEGIN 
     FETCH NEXT FROM @REFCURSOR INTO @RECODE,@RE; 
     INSERT INTO ABSENCE (CODE, REASONING) VALUES (@RECODE,@RE); 
     SET @MIN+=1; 
END 
CLOSE @REFCURSOR 
DEALLOCATE @REFCURSOR 

SELECT EMPID,CODE,REASONING FROM ABSENCE 

雖然我只插入兩列,它正試圖插入EMPID(已被填充),並因爲它不能爲空,所以插入失敗。

另外,如何隨機化REARRAY表變量中的值以將它們插入到ABSENCE表中?

+0

'SELECT DISTINCT @@ ROWCOUNT'?你覺得這意味着什麼?是否有意'更新''ABSENCE'中的行來填充兩個新列的值? 「INSERT」需要爲所有列提供值,無論是顯式還是隱式:標識列,可空列和默認值。 – HABO

+0

希望通過@@ rowcount和loop獲取行數。感謝您對關於插入的澄清。 – skrubber

+0

['@@ ROWCOUNT'](https://msdn.microsoft.com/en-us/library/ms187316.aspx?f=255&MSPPError=-2147217396)返回前一條語句影響的行數。應用'DISTINCT'和使用'FROM'子句是令人困惑的。你已經寫了一些東西,比如'聲明@Pi作爲Float =(從Information_Schema.Table_Constraints中選擇top 1 3.1415927,其中42不是NULL);',儘管如果表沒有行的話會失敗。 – HABO

回答

0

由於這是一個小型數據集,因此一種方法可能是使用CROSS APPLYSELECT TOP(1) ... FROM @rearray ORDER BY NEWID()方法。這基本上會將您的ABSENCE表與UPDATE語句中的參考表結合起來,每次在聯接中選擇一個隨機行。完整地,它看起來像:

UPDATE ABSENCE 
SET col1 = x1.recode, col2 = x2.recode 
FROM ABSENCE a 
    CROSS APPLY (SELECT TOP(1) * FROM @rearray ORDER BY NEWID()) x1(recode, re) 
    CROSS APPLY (SELECT TOP(1) * FROM @rearray ORDER BY NEWID()) x2(recode, re)