我有一个有40个员工I的表,需要从一个表变量中添加两列,该变量充当一个引用表。对于每个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 (已被填充)中,并且由于它不能为NULL,所以插入失败。
另外,如何将REARRAY表变量中的值随机化,以将它们插入到缺勤表中?
发布于 2015-04-21 04:26:31
由于这是一个很小的数据集,因此一种方法可能是将CROSS APPLY与SELECT TOP(1) ... FROM @rearray ORDER BY NEWID()方法一起使用。这实际上是在UPDATE语句中连接ABSENCE表和引用表,每次连接时都会随机选择一行。总而言之,它看起来像是:
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)https://stackoverflow.com/questions/29757583
复制相似问题