求:SQL 语句中的二进制数据转字符串的函数(回答正确可得1000分)(300分)

  • 主题发起人 主题发起人 网中戏
  • 开始时间 开始时间

网中戏

Unregistered / Unconfirmed
GUEST, unregistred user!
一个表A中的字段B存有二进制数据“1234567890”
用语句
SELECT B FROM A
结果为
0x31323334353637383930

有什么函数可以直接转换成"1234567890" 返回??
 
先抢个沙发

具体函数不知道有没有
不过 不是可以自定义sql里面的函数吗?
自己写一个应该也可以的
但怎么写呢?
关注~~~``
 
你的b字段是什么类型的
 
To
李翔鹏
image 的呀
 
取出这个结果后再用DELPHI函数转换一下不就 行了

0x31323334353637383930 --这个是二进制数吗? 最多是个十六进制数阿
 
function TReg_Form.HexToInt(Str: string): int64; //16进制数转换为10进制数

var
TmpStr: string;
i, j: integer;
MyAry: array of integer;
Sum: integer;
begin
TmpStr := Trim(Str);
j := Length(TmpStr);
SetLength(MyAry, j);
for i := Length(TmpStr) downto 1 do //每一位十六进数转换为十进制数
begin
case TmpStr of
'1': MyAry[i - 1] := 1;
'2': MyAry[i - 1] := 2;
'3': MyAry[i - 1] := 3;
'4': MyAry[i - 1] := 4;
'5': MyAry[i - 1] := 5;
'6': MyAry[i - 1] := 6;
'7': MyAry[i - 1] := 7;
'8': MyAry[i - 1] := 8;
'9': MyAry[i - 1] := 9;
'A': MyAry[i - 1] := 10;
'B': MyAry[i - 1] := 11;
'C': MyAry[i - 1] := 12;
'D': MyAry[i - 1] := 13;
'E': MyAry[i - 1] := 14;
'F': MyAry[i - 1] := 15;
'0': MyAry[i - 1] := 0;
end;
end;
//以下为得到十进制数
Sum := 0;
for i := 1 to j do
begin
Sum := Sum + MyAry[i - 1] * Trunc(Exp(Ln(16) * (j - i)));
end;
Result := Sum;
end;
 
uses
StrUtils;

function GetRealStr(const AStr: string): string;
var
i: Integer;
tmpStr: string;
begin
Result := '';
if length(AStr)>=4 then
begin
tmpStr := RightStr(AStr, Length(AStr)-2);
for i:=1 to Round(length(tmpStr)/2) do
begin
Result := Result + Chr(StrToInt('$' + LeftStr(tmpStr, 2)));
tmpStr := RightStr(tmpStr, Length(tmpStr)-2);
end;
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
ShowMEssage(GetRealStr('0x31323334353637383930'));
end;
 
CREATE TABLE CARDIDTABLE
(KEYID NUMERIC(8) ,
CARDIDDATA IMAGE ,
CONSTRAINT PRI_CARDIDTABLE PRIMARY KEY (KEYID))
GO

INSERT CARDIDTABLE (KEYID,CARDIDDATA) VALUES (0,'123456789')

有语句 SELECT CARDIDDATA FROM CARDIDTABLE
就得到 0x313233343536373839
 
0x313233343536373839
0x 表示十六进制

0x31 49 ascii: 1
0x32 50 ascii: 2
0x33 51 ascii: 3
0x34 52 ascii: 4
....
 
明白了.原来是这种格式阿
 
就是把123456789的ASCII 值'0x313233343536373839' 转换
原来在程序中转的。现优化代码想放在存储过程中直接转换了。所以求SQL的语句啊
 
肯定有难度的啊。不然正确回答另外送1000分啊[:D]
 
select cast (0x313233343536373839 as varchar(20))
 
function TransHexToStr(strHex: string):String;
var
s2:String;
i,n:Integer;
begin
Result:='';
n:=length(strHex) div 2;
s2:='';
for I:=1 to n do
s2:=s2+Char(StrToInt('$'+Copy(strHex,2*i-1,2)));
Result:=s2;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(TransHexToStr(Edit1.Text));
end;
 
select cast(b as varchar(30) from a
 
给分吧,OK
 
To 李翔鹏
我表有很多行啊 如
123456789
323536987
478523691
……
你的只能转一行。
 
select cast(b as varchar(30) as newb from a
 
在SQL帮助里面看一下CONVERT的帮助就知道了,可以用CONVERT函数来实现,CONVERT函数还是有不少的限制的,不能直接转换。
select convert(char(1000),convert(binary,B)) from A
 
楼上可以的,测试通过了.
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
926
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部