2017-01-19 5 views
0

私は毎晩書き直されるテーブルを持っています。私は値のセットリストから乱数を入力する必要がある2つの列を持っています。角度欄には15,30,45,60,90が、距離には9,15,21がそれぞれ入力されている必要があります。挿入ステートメントは、最大700のレコードを処理できます。値のセットリストから乱数を含むSQL更新列

I次に(select top 1 val from @MyRandomVal1 order by newid())を使用

select 15 union 
select 30 union 
select 45 etc... 

と一時テーブル(@MyRandomVal1)を作成しようとしています。これにより、すべての行に対して同じ乱数で列が移入されます。私の研究では、ループが推奨されていないと読んだのですが、挿入された行をループする必要があるようです(select top 1 val from @MyRandomVal1 order by newid())。挿入中にセットリストから無作為抽出を700+行に移入する別の方法はありますか?

以下は、私の既存のコードです(アングルのみ)。 SQL Server 2012。

DECLARE @MyRandomVal1 Table (
     id int identity (1,1), 
     val int not null) 

INSERT INTO @MyRandomVal1 (val) 
    SELECT 15 
    union 
    SELECT 30 
    union 
    SELECT 45 
    union 
    SELECT 60 
    union 
    SELECT 90 

INSERT INTO MyTable (AUTO_KEY,E3_KEY,EMPID,ENAME,COLOR,ANGLE) 
    SELECT dbo.getautokey(),dbo.GetAutoKey(),[EMPID],[ENAME],abs(checksum(NewId()) % 256),(select top 1 val from @MyRandomVal1 order by newid()) 
    FROM MyTable2 WHERE [JOBLEVEL]='SVP' 

ありがとう。

+0

カーソルはどうですか? –

+0

[SQLランダムネームジェネレータは同じ行に姓と名を挿入しない]の重複の可能性があります(http://stackoverflow.com/questions/31948717/sql-random-name-generator-not-inserting-first-and-last -name-in-the-same-row) – SMM

+0

具体的にはhttp://stackoverflow.com/a/31951347/6490059がその質問に答えているようです。 – SMM

答えて

0

これを行うには1つの方法があります。 trueの場合、@ MyRandomVal1をMyTable2に参加させてください。 newid()によって順序付けられた行番号を追加します。その後、すべてのrownumber 1を取得します。 PARTITION BYのロジックを確認する必要があります。一意の列があるかどうかはわかりませんでした。そうでない場合は、ランダム値テーブルの各行に各行を結合するので、すべての列で分割する必要があります。

DECLARE @MyRandomVal1 Table (
     id int identity (1,1), 
     val int not null) 

INSERT INTO @MyRandomVal1 (val) 
    SELECT 15 
    union 
    SELECT 30 
    union 
    SELECT 45 
    union 
    SELECT 60 
    union 
    SELECT 90 

;WITH cte AS (
SELECT 
    dbo.getautokey() AS AUTO_KEY 
    , dbo.GetAutoKey() AS E3_KEY 
    , [EMPID] 
    , [ENAME] 
    , ABS(checksum(NewId()) % 256) AS COLOR 
    , a.val 
    , ROW_NUMBER() OVER (PARTITION BY empid ORDER BY NEWID()) AS rn 
FROM MyTable2 
JOIN @MyRandomVal1 a ON 1 = 1 
WHERE [JOBLEVEL]='SVP') 

INSERT INTO MyTable (AUTO_KEY, E3_KEY, EMPID,ENAME, COLOR, ANGLE) 
    SELECT * FROM cte 
    WHERE rn = 1 

私たちは例のデータを持っていないので、ここには簡単なDEMOがあります。

+0

SQLChaoに感謝します。これはトリックでした。私が追加しなければならなかったのは、cteから挿入するためのMyTableの新しい列でした。それを追加せずに、私はINSERTステートメントよりもSELECTステートメントに多くの列を持っていました。 @SMMは、ランダムな名前のジェネレータを見ましたが、うまくいきませんでした。これは私のスキルレベルではもう少し簡単でした。 – Slink182

関連する問題