2017-02-15 96 views
0

我想用下面的代碼在SQL上進行位開關的簡單更新。SQL Server 2016浮點值位操作

UPDATE table SET BoolFields = BoolFields + 1.0 WHERE BoolFields & 1.0 <> 1.0

然而,當我在Management Studio中運行這個,我收到

操作數的數據類型浮動是 '&' 操作無效。

有沒有人有線索來解決這個問題,而無需將BooFields從float更改爲其他類型?

編輯

有人評論我的情況並不清楚如此編輯。

條件是我想檢查並查看是否某個位被標記爲一個。 所以我的實際行可以BoolFields & 128.0 <> 128.0

然後

我想SET BoolFields = BoolFields + 128.0

,所以我只是想旗布爾值,只有當它不被標記爲1

+1

如果你可以告訴'update'執行什麼條件,它會有幫助嗎?這個問題還不清楚。 –

+1

請解釋一下,你想達到什麼目的。這聞起來像一個[XY-問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)... – Shnugo

+1

在***浮動***上按位?爲什麼你在所有*上使用float *,但特別是在存儲位時? –

回答

2

如果你真的需要在你的浮點值上使用按位運算符 - 它們不支持它們 - 你需要將它們轉換爲支持按位運算的類型,如bitint(這裏https://msdn.microsoft.com/en-us/library/ms176122.aspx列出)​​,即:

update table set BoolFields = BoolFields + 1.0 where cast(BoolFields as int) & 1 <> 1 

但在我看來,你應該考慮對浮點數的範圍內操作,而不是強迫位運算符。也許你應該描述一個用例來說明一下,爲什麼你想這樣做。

+0

謝謝。這解決了我的問題。我們的代碼使用超過16位,所以我們確實需要32位存儲,但我希望我們使用bigint而不是float來存儲位信息。但我沒有權力改變類型。 –

+0

嗯int有32位不是16.所以我真的不知道爲什麼我們使用浮動,但我們是。如上所述,我不能改變類型... –