2017-02-15 8 views
0

Я хотел бы выполнить простое обновление с битовым переключением на SQL со следующим кодом.Бит мудрая операция по поплавковому значению на SQL Server 2016

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

Однако, когда я запускаю это на Management Studio, я получаю

Операнда типа данных с плавающей точкой является недопустимой для оператора '&'.

Может кто-нибудь подскажет исправить эту проблему, не изменяя BooFields от float до какого-либо другого типа?

EDIT

Некоторые комментируя мое состояние было не ясно, так редактирования.

Условие заключается в том, что я хочу проверить и увидеть, отмечен ли определенный бит как один. Так моя фактическая линия может быть 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

Если вам действительно нужно использовать поразрядный оператор на ваших значениях с плавающей запятой - которые не поддерживают их - вам нужно отнести их к типу, поддерживающему побитовые операции, такие как bit или int (перечисленных здесь 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

Well int имеет 32 бита не 16. Так что я действительно не знаю, почему мы используем float, но мы есть. И, как указано выше, я не могу изменить тип ... –