2011-06-15 29 views
2

テスト目的のために、列のビットをランダムな値に設定してテーブルを更新したいとします。SQLのランダムビットを反転する方法

update [Planned] 
set [IsPlannable] = 1 * rand(cast(cast(newid() as binary(8)) as int)) 
WHERE [ComputerID] > 100 

私がそれ好きな方法それが必要としてではなく、動作するようには思えません。私はこの問題は、結果はほとんどの時間を超える1

がどのように私はにランダムな値ランダムビットを反転することができますだと思いますか?

答えて

6

1 *はまだ更新はすべてあなたが1

に可能性が設定されているcast(0.9 as bit)うとしてcast(0.1 as bit)が1をyeildだろうことを考えると小数&を得ています。

update Planned set IsPlannable = case when rand(cast(newid() as binary(8))) < 0.5 then 0 else 1 end 
+0

これは/ elseがパフォーマンスに重大な影響を与えますか?これは今の場合ではありませんが、後でこのパターンを使うためには? –

+0

私は高価なランド(キャスト(newid()..)は一度しか評価されず、バイアスを導入するように変更することもできます。 –

+0

works ..ありがとう! –

0

どの程度

cast(round(rand(), 0) as bit) 
+0

。 –

+0

どういう意味ですか? SQL Server 2008 R2ではどのバージョンを使用しているのですか? – alnorth29

+0

これは同じビットのすべての行に対して単一の値にフリップされます。 –

1

あなたが使用する必要がありますどのように多くのビットフィールドに応じて、あなたはこのようなものを使用して可能な設定のすべてを生成することができます。これは動作しません

with test as (
    select 0 as myId, cast(0 as bit) col1, cast(0 as bit) col2, cast(0 as bit) col3 
    union all 
    select myId + 1, 
     case when myId & 1 = 1 then cast(1 as bit) else cast(0 as bit) end, 
     case when myId & 2 = 2 then cast(1 as bit) else cast(0 as bit) end, 
     case when myId & 4 = 4 then cast(1 as bit) else cast(0 as bit) end 
     from test 
     where myId<100 
) 
select distinct col1, col2, col3 from test 
関連する問題