2009-01-02 23 views
2

有沒有什麼好辦法轉換爲二進制(基數爲2)字符串在T-SQL整數(如果不是我想我可以寫一個函數...)T-SQL:轉換「0110」到6

'0110'=> 6等

+0

請看Peter DeBetta的[博客文章](http://sqlblog.com/blogs/peter_debetta/archive/2008/10/15/964.aspx);你可以用這個作爲起點。 – 2009-01-02 09:21:23

回答

1

你知道字符串將永遠是一個特定的長度嗎?如果是的話,你可能硬編碼一堆的子串/轉換爲詮釋/乘法步驟。這將不完全是很好,但...

編輯:爲了給多一點細節,想你知道這將是長度爲4,你可以這樣做:

SELECT (8 * CONVERT(int, SUBSTRING(@x, 1, 1))) 
    + (4 * CONVERT(int, SUBSTRING(@x, 2, 1))) 
    + (2 * CONVERT(int, SUBSTRING(@x, 3, 1))) 
    + (1 * CONVERT(int, SUBSTRING(@x, 4, 1))) 

道歉,如果語法稍微偏離。

不愉快,並且在更一般的情況下(您基本上需要以某種形式循環)不起作用,但它可能足以快速修復。如果downvoters可以請添加評論,這將是非常讚賞。T-SQL是在我的專業領域之外 - 解釋爲什麼這是一個糟糕的主意是更有幫助,而不僅僅是downvote來指示它不好主意。)

+0

我認爲這是downvoted導致其脆弱如地獄。像這樣的代碼總是打破生產 – 2009-09-09 23:12:52

0

我有一些模糊的類似HERE(StackOverflow),我在詢問T-SQL中定製的「基本」轉換。

這將是有趣的,看看你有什麼建議!

1

看起來像this function做你所需要的。 另外,看起來像這裏有an optimisation

我不知道任何內置的,將在選擇語句工作,鑄造二進制或varbinary沒有幫助。

看起來像你被卡住,要麼寫作這是一個UDF或擴展存儲過程(託管或本地)。

另一種選擇可能是創建一個巨大的查找表並加入它。你可能會得到比Sql函數更好的性能,我沒有測試過它。我懷疑它會比擴展存儲過程更好。

1

Oki,這是第一次嘗試和快速破解並試圖解決這個問題。 它當然不是很漂亮,但可能會給你一些關於如何最好地解決問題的想法。

編輯:只是重讀sambo99答案,並指出優化版本鏈接提到那裏。我在回答之前錯過了。它看起來有些相似,但是這個最好是高達63位,因爲那個被引用的鏈接僅適用於高達31位,並且如果你試圖更多地傳遞它,它將會爆炸。這個版本忽略任何高於63的東西。

DECLARE @bin varchar(63) 
DECLARE @origlen int 
DECLARE @currlen int 
DECLARE @tmp int 
DECLARE @pwr bigint 
DECLARE @dec bigint 
DECLARE @val bigint 

SET @pwr = 2 
SET @dec = 0 
SET @bin = '011111111111111111111111111111111' --Test Value 

SET @bin = REVERSE(@bin) 
SET @origlen = LEN(@bin) 
SET @currlen = 0 

WHILE(@currlen <> @origlen) 
BEGIN 
    SET @tmp = CONVERT(int, SUBSTRING(@bin, @currlen + 1, 1)) 

    IF (@tmp <> 0) 
    BEGIN 
     SET @val = @dec 
     SET @dec = POWER(@pwr, @currlen) 
     SET @val = @val + @dec 
     Set @dec = @val 
    END 

    SET @currlen = @currlen + 1 

END 

SELECT @val as 'Result' 

希望這有助於。