SQL Server读取binary或image特定字节应该怎么实现

imlmy 2013-07-27 04:22:52
假设有一个image字段有100个字节,我想4个字节这样循环读取这个字段,需要怎么实现
...全文
319 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
imlmy 2013-07-30
  • 打赏
  • 举报
回复
CREATE FUNCTION dbo.fnBinaryFloat2Float
(
	@BinaryFloat BINARY(8)
)
RETURNS FLOAT
AS
BEGIN
	DECLARE	@Part TINYINT,
		@PartValue TINYINT,
		@Mask TINYINT,
		@Mantissa FLOAT,
		@Exponent SMALLINT,
		@Bit TINYINT,
		@Ln2 FLOAT,
		@BigValue BIGINT

	SELECT	@Part = 1,
		@Mantissa = 1,
		@Bit = 1,
		@Ln2 = LOG(2),
		@BigValue = CAST(@BinaryFloat AS BIGINT),
		@Exponent = (@BigValue & 0x7ff0000000000000) / EXP(52 * @Ln2)

	WHILE @Part <= 8
		BEGIN
			SELECT	@Part = @Part + 1,
				@PartValue = CAST(SUBSTRING(@BinaryFloat, @Part, 1) AS TINYINT),
				@Mask =	CASE WHEN @Part = 2 THEN 8 ELSE 128 END

			WHILE @Mask > 0
				BEGIN
					IF @PartValue & @Mask > 0
						SET @Mantissa = @Mantissa + EXP(-@Bit * @Ln2)

					SELECT	@Bit = @Bit + 1,
						@Mask = @Mask / 2
				END
		END

	RETURN	SIGN(@BigValue) * @Mantissa * POWER(CAST(2 AS FLOAT), @Exponent - 1023)
END

不太懂他的算法,不好改
imlmy 2013-07-30
  • 打赏
  • 举报
回复
引用 11 楼 ap0405140 的回复:
是的,我的做法: 1.用ADODB.Connection对象,在连线中创建临时表, [Connection对象].Execute ("create table #t(...) ") 2.传入数据. [Connection对象].Execute "insert into #t(...) ... ") 3.调用存储过程. [Connection对象].Execute "exec dbo.spname ") 在存储过程里,可直接调用临时表#t.
这倒是个办法。我是想看看有没有更直接一点的解决方案。不过现在找了一下,发现二进制转浮点数确实不容易实现,没找到什么现成的解决方法
唐诗三百首 2013-07-30
  • 打赏
  • 举报
回复
引用 11 楼 ap0405140 的回复:
是的,我的做法: 1.用ADODB.Connection对象,在连线中创建临时表, [Connection对象].Execute ("create table #t(...) ") 2.传入数据. [Connection对象].Execute "insert into #t(...) ... ") 3.调用存储过程. [Connection对象].Execute "exec dbo.spname ") 在存储过程里,可直接调用临时表#t.
我是有分行的,怎么分行符没了呢!
唐诗三百首 2013-07-30
  • 打赏
  • 举报
回复
是的,我的做法: 1.用ADODB.Connection对象,在连线中创建临时表, [Connection对象].Execute ("create table #t(...) ") 2.传入数据. [Connection对象].Execute "insert into #t(...) ... ") 3.调用存储过程. [Connection对象].Execute "exec dbo.spname ") 在存储过程里,可直接调用临时表#t.
imlmy 2013-07-30
  • 打赏
  • 举报
回复
引用 9 楼 ap0405140 的回复:
数据量较大时,可以用临时表.
这个存储过程是提供给外部程序调用的,用临时表是指让他们先把数据插入到临时表里面,再调用存储过程进行处理吗
唐诗三百首 2013-07-30
  • 打赏
  • 举报
回复
数据量较大时,可以用临时表.
imlmy 2013-07-30
  • 打赏
  • 举报
回复
引用 6 楼 ap0405140 的回复:
把二进制转化成float类型? 请问有什么意义?
存储过程的参数原来是一个字符串,是整型数和浮点数的数组,原来的格式是int,float;int,float;... 不过这种格式在数据量较大的情况下构造和解析字符串会很慢,就想改用二进制,4个字节整型4个字节浮点型这样,存储过程中再对这个二进制进行解析
唐诗三百首 2013-07-30
  • 打赏
  • 举报
回复
把二进制转化成float类型? 请问有什么意义?
imlmy 2013-07-30
  • 打赏
  • 举报
回复
不过现在想把二进制转化成float类型,无法直接转换,需要自定义转换函数
長胸為富 2013-07-29
  • 打赏
  • 举报
回复
解决了就好
唐诗三百首 2013-07-29
  • 打赏
  • 举报
回复
恭喜恭喜..
imlmy 2013-07-29
  • 打赏
  • 举报
回复
能把分给自己吗
imlmy 2013-07-29
  • 打赏
  • 举报
回复
自己解决了。可以用substring来获取特定位置的二进制数组。获取二进制数组长度的可以使用datalength。

27,581

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧