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/