2015-04-20 5 views
0

У меня есть таблица ABSENCE, в которой есть 40 идентификаторов сотрудников и необходимо добавить два столбца из переменной таблицы, которая действует как справочная таблица. Для каждого 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, чтобы вставить их в таблицу 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' являются непонятными. Вы написали что-то вроде 'declare @Pi как Float = (выберите top 1 3.1415927 из Information_Schema.Table_Constraints, где 42 не является NULL);', хотя это не получится, если в таблице нет строк. – HABO

ответ

0

Поскольку это небольшой набор данных, один подход может заключаться в использовании CROSS APPLY с подходом SELECT 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) 
Смежные вопросы