2009-01-02 81 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' 

希望这有助于。