原先想說,
select Convert(binary(10),20),這樣試試
結果,出來的卻是
0x00000000000000000014
天丫,居然變成16進位了,這不是我想要的耶~~
我是希望,打了20,可以幫我轉成「10100」。這樣才對!
在網路上找了挺久,sql似乎沒有這樣的函數,
那既然沒有default的,那就自己來寫一個吧!
在c#中,寫function,很簡單,而在sql自訂函數呢?嘻~一樣很簡單
- 「可程式性」中,有個「函數」,將分支打開後,裡面有sql預設的所有函數,若在找函數用時,可以來參考看看喲!(我也是這次才注意到),直接在「函數」上按右鍵選「新增」,另有一層,是選擇傳回值的資料,看是傳回單值,還是傳回資料表的,這次是要傳回一個轉換後的字串,所以選擇「純量值函數」。
- 在新增畫面中,感覺跟「預存程序」差不多嘛~姑且,我將要填入值的地方,分成幾個部份。「說明」「自訂函數名稱」「定義自訂函數參數」「定義回傳資料型態」「宣告回傳值變數」「運算區」「回傳指令」
- 確定執行無誤後,接著就是呼叫啦~~~執行: select dbo.ToBinary(20,5)。結果:10100
以下是自訂函數的程式:
-- =============================================
-- Author: 宗
-- Create date: 20081226
-- Description: 將數值資料轉換成二進位字串
-- =============================================
ALTER FUNCTION [dbo].[ToBinary]
(
-- Add the parameters for the function here
@Number int ,--傳入要轉換的數值資料
@Max int --可接受的最大字元數
)
RETURNS nvarchar(31) --共可接受31位數(因為int只到2的31次方)
AS
BEGIN
-- Declare the return variable here
DECLARE @binery nvarchar(31)
set @binery=''
-- Add the T-SQL statements to compute the return value here
--若數值超過所設定的次方數的或是超過函數自訂的31次方,則回傳空字串
if (@Max>31)
begin
return @binery
end
if @Number>power(2,@Max)
begin
return @binery
end
--檢查若都無誤,則進行轉換
declare @min int
set @min =0 --起始值
--進行轉換
while @min<@max+1
begin
if @Number=0
break
set @binery = Convert(nvarchar(10),@Number % 2)+ @binery;
set @Number = @Number / 2;
set @min=@min+1
end
-- Return the result of the function
RETURN @binery
END