[1]現在の年は365日あり、私たちは、0と364の間psedoランダムのINTを生成することができます
SELECT ABS(CHECKSUM(NEWID()) % 365) -- Within SSMS press F5/Execute few times
[2]我々は、単にので、DATEADDを使用することができ、現在の年以内のランダムな日付を生成するには、次の
SELECT DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 365), {d '2017-01-01'}) -- Within SSMS press F5/Execute few times
-- it adds a days how many days ? to first day of year
例:
[3]今、私たちは、このようにUPDATEステートメント内この式を使用することができます。
UPDATE dbo.Orders
SET OrderDate = DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 365), {d '2017-01-01'})
編集#1:
: [4]私は本当に簡単なテスト3回(SQL2016)以下を実行しました
--DROP TABLE dbo.Test1, dbo.Test2
GO
CREATE TABLE dbo.Test1(
ID INT IDENTITY(1,1) PRIMARY KEY,
RandValue INT NOT NULL
)
GO
INSERT dbo.Test1 (RandValue)
VALUES ((SELECT ABS(CHECKSUM(NEWID())) % 10000))
GO 10000
CREATE TABLE dbo.Test2(
ID INT IDENTITY(1,1) PRIMARY KEY,
RandValue INT NOT NULL
)
GO
INSERT dbo.Test2 (RandValue)
VALUES ((SELECT ABS(CONVERT(INT, CRYPT_GEN_RANDOM(4))) % 10000))
GO 10000
結果:
SELECT COUNT(DISTINCT x.RandValue) AS DistinctCnt1
FROM dbo.Test1 x
SELECT COUNT(DISTINCT x.RandValue) AS DistinctCnt2
FROM dbo.Test2 x
-- Test# DistinctCnt1 DistinctCnt2
-- 1 6351* 6338
-- 2 6301 6385*
-- 3 6296* 6268
[マイ]結論:結果は明確に区別を明らかにしませんこれら2つの方法。
に
update
からの部品に注力したいと思うここで半分です: 'SELECT REPLACEは( 'UPDATE $トンのSETの$ C = ...'、「$(REPLACE t '、QUOTENAME(t。[name]))、' $ c '、QUOTENAME(c。[name]))sysからです。テーブルt JOIN sys.columns c ON c。[object_id] = t。[object_id] WHERE t.is_ms_shipped = 0 AND c.system_type_id = 61'。他の半分は「...」をあなたにランダムな日付を与える式で埋めています。何か 'RAND()'、何か 'DATEDIFF' /' DATEADD'のようなものです。必要な場合は、 'EXECUTE'とカーソルを使って結果の文を実行するという3つ目の部分があります。それは確かに楽しい小さなプロジェクトです。 –