ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Sql server内部函数fn_PhysLocFormatter存在解析错误(续)

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

原创 Linux操作系统 作者:cow977 时间:2012-12-31 10:31:13 0 删除 编辑

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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-03-02

  • 博文量
    698
  • 访问量
    791770