Sql server内部函数fn_PhysLocFormatter存在解析错误(续)

Sql server内部函数fn_PhysLocFormatter存在解析错误,见http://space.itpub.net/81227/viewspace-751651

 

本文给出错误原因。

 

先看下sys.fn_PhysLocFormatter函数的定义:

select OBJECT_DEFINITION(object_id('sys.fn_PhysLocFormatter'))

go

 

-------------------------------------------------------------------------------

-- Name: sys.fn_PhysLocFormatter

--

-- Description:

-- Formats the output of %%physloc%% virtual column

--

-- Notes:

-------------------------------------------------------------------------------

create function sys.fn_PhysLocFormatter (@physical_locator binary (8))

  returns varchar (128)

as

  begin

     declare @page_id binary (4)

     declare @file_id binary (2)

     declare @slot_id binary (2)

     -- Page ID is the first four bytes, then 2 bytes of page ID, then 2 bytes of slot

     --

     select @page_id = convert (binary (4), reverse (substring (@physical_locator, 1, 4)))

     select @file_id = convert (binary (2), reverse (substring (@physical_locator, 5, 2)))

     select @slot_id = convert (binary (2), reverse (substring (@physical_locator, 7, 2)))

     return '(' + cast (cast (@file_id as int) as varchar) + ':'

          +       cast (cast (@page_id as int) as varchar) + ':'

          +       cast (cast (@slot_id as int) as varchar) + ')'

  end

再看下reverse函数:

select reverse('工人')

----

人工

 

(1 行受影响)

 

select reverse('12345工人')

---------

人工54321

 

(1 行受影响)

 

select reverse('12345')

---------

54321

 

(1 行受影响)

结论:问题出在reverse函数上。

reverse函数的作用是字符反转,而不是字节反转,当遇到81-FE之间的字节时,被认为是双字节字符而组合在一起参与反转操作,造成了错误。

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/81227/viewspace-751898/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/81227/viewspace-751898/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值