2.1 TIP
  Exception message: DataReader.GetFieldType(4) returned null. Exception data: System.Collections.ListDictionaryInternal
  注意,极有可能我们把字段更新上去后,我们的程序却出错了,如上。这个时候,我们需要把
  C:Program FilesMicrosoft SQL Server100SDKAssembliesMicrosoft.SqlServer.Types.dll
  这个DLL打包到我们的应用程序中去。原因不解释了。
  看看效果吧,修改过后的代码为:
  DECLARE @tmpIds hierarchyid
  SELECT @tmpIds=Pids FROM EL_Organization.Organization WHERE ID='ecc43c7159924dca91e2916368f923f4';
  WITH CTEGetChild AS  (
  SELECT * FROM EL_Organization.Organization WHERE ID='ecc43c7159924dca91e2916368f923f4'
  UNION ALL(
  SELECT * FROM EL_Organization.Organization WHERE Pids.IsDescendantOf(@tmpIds)=1
  )
  )
  SELECT * FROM CTEGetChild
  现在,我们的时间到了1S内。
  2.2 一切为了不动应用层代码
  现在,既然,增加了一个字段,我们要维护这个字段,如:本条记录在应用程序中被移动到了别的父级下,需要更新这个字段。为了不动上层代码,能做的是创建触发器,即:原有的ParentId变动的时候,需要更新这个PIds字段,于是,我们创建触发器如下:
create trigger UpdateOrgPIds
on EL_Organization.Organization
after update
as
if update ([ParentId])
begin
declare @tmpId varchar(36)
select @tmpId=id from inserted
update EL_Organization.Organization set pids=dbo.f_cidname(@tmpId)
end
go
-- drop  trigger EL_Organization.UpdateOrgPIds