2015-07-21 3 views
1

Я нашел много ответов, когда вызов RAND постоянно обновляется, но это означает, что при создании разных значений для каждой строки операция не может быть повторена с тем же результатом. Есть ли способ гарантировать, что каждая строка получает новое значение, но где она по-прежнему посеяна начальным вызовом?SQL Server 2008, как обновить столбец с посеянными случайными значениями?

Нижеприведенные попытки не работают:

UPDATE #TestTable 
SET 
    Number = CONVERT(INT, FLOOR(RAND(CHECKSUM(NEWID())) * 1000)) 

Каждая строка имеет другое значение, но каждый раз, когда я запускаю его значения для данной строки изменяются.

DECLARE @RandomSeeder FLOAT; 

--Seeds the value, probably a better way to do this. 
SELECT @RandomSeeder = RAND(5336); 

UPDATE #TestTable 
SET 
    Number = CONVERT(INT, FLOOR(RAND() * 1000)); 

Похоже, что RAND вызывается один раз, а затем это значение используется в каждой строке.

+2

Почему вам нужно повторить операцию с теми же результатами? Кинда - оксюморон. Мне нужны одни и те же значения и порядок от случайной функции ... – xQbert

+2

См. [Этот ответ] (http://stackoverflow.com/a/30173756/119477) –

+0

@xQbert Мне нужны случайные данные, но я хочу, чтобы чтобы начать с того же места во время работы на нем, чтобы, если я нахожу ошибку, я могу ее повторно тестировать. Представьте, что вы пытаетесь отлаживать код, который полагается на вызовы на случайную функцию. Без возможности семени отладки случайного вызова функция намного сложнее. – Lawtonfogle

ответ

0

Чтобы поставить Guid в качестве значения столбца вы должны объявить его как, например:

[Number] UniqueIdentifier CONSTRAINT [DF_Email_EmailID] DEFAULT (NEWSEQUENTIALID()) NOT NULL

вы могли бы использовать это значение для генерации случайного числа.

+0

Невозможно повторить это повторение результатов. И это не случайно. Быть последовательным. –

+0

он сказал, что ему нужны случайные данные, с возможностью повторить процесс. вместо таблицы temp он может хранить в постоянной таблице эти значения, использовать значение для вызова функции на основе случайного числа, сгенерированного этим GUID, это может быть хэш или контрольная сумма на основе идентификатора GUID, а затем, если он хочет чтобы повторить процесс, он мог узнать значение, применив ту же формулу снова к этой строке GUID. – montelof

0

Короче говоря, RAND() не по умолчанию. Per Conrad Frix в комментариях, он разработан как детерминированный, поэтому для вызова через RAND() необходимо создать представление и функцию для его вызова.

Установка для создания представления и функции заключаются в следующем:

IF OBJECT_ID('RANDView') IS NOT NULL 
BEGIN DROP VIEW RANDView END 
GO 

CREATE VIEW RANDView 
AS SELECT RAND() AS RANDNumber 
GO 

IF OBJECT_ID('SeededRAND') IS NOT NULL 
BEGIN DROP FUNCTION SeededRAND END 
GO 

CREATE FUNCTION SeededRAND() RETURNS FLOAT 
AS BEGIN 
    DECLARE @Return FLOAT 
    SELECT @Return = RANDNumber FROM RANDView 
    RETURN @Return 
END 
GO 

демо, которая использует эту точку зрения и функция может быть записана следующим образом:

CREATE TABLE #TestTable (
TestNum INT); 

INSERT INTO #TestTable 
VALUES (1),(2),(3),(4); 

SELECT * FROM #TestTable; 

SELECT RAND(5336); -- Seed the RAND() function 

UPDATE #TestTable 
SET TestNum = CONVERT(INT, FLOOR(dbo.SeededRAND() * 1000)); 

SELECT * FROM #TestTable; 

You can play with the demo in SQL Fiddle here.

Смежные вопросы