使用CLR会造成内存方面的问题吗

http://tech.ddvip.com   2008年01月23日    社区交流

内容摘要:我老是担心使用CLR会造成内存方面的问题,比如内存不能回收。其实想一想也许我过滤了,毕竟.NET Framework能够自己回收托管内存。既然在应用服务器上能使用,数据库上似乎也可以使用。

  我们可以看一下我刚刚作的一个实例:

  SQL code

-- 测试指定的目标字符串是否与给定的正则表达式模式匹
  /*
  IF ForString.IsMatchPattern(NULL, NULL)
     = 1 PRINT 'yes' ELSE PRINT 'no'
  DECLARE @target nvarchar(128)
  SET @target = N'a阿阿abcdef
  ppps'
  IF ForString.IsMatchPattern(@target, '[u00ff-uffff]+[a-z]+s*[p]+')
     = 1 PRINT 'yes' ELSE PRINT 'no'
  IF ForString.IsMatchPattern(@target, '[u00ff-uffff]+[a-z]+s*[p]+$')
    = 1 PRINT 'yes' ELSE PRINT 'no'
  */
  IF OBJECT_ID(N'ForString.IsMatchPattern') IS NOT NULL DROP FUNCTION ForString.IsMatchPattern
GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集
  CREATE FUNCTION ForString.IsMatchPattern -- 测试指定的目标字符串是否与给定的正则表达式模式匹配
(
  @target nvarchar(512) , -- 要测试的目标字符串
  @pattern nvarchar(512) , -- 给定的正则表达式模式
  @nullreturn bit = 0 -- 当 target 为 null 时的返回值
)
RETURNS bit -- 如果 target 或 pattern 为 null 则返回 false,否则返回测试的结果
AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.ForString].IsMatchPattern
  GO
  
-----------------------------------------------------------------------------------------------------
-- 对左操作数和右操作数进行二进制按位“或”运算
  /*
  PRINT ISNULL(ForBinary.OperationOr(NULL, NULL), 0x0)
  PRINT ISNULL(ForBinary.OperationOr(0x123, NULL), 0x0)
  PRINT ISNULL(ForBinary.OperationOr(0x60, 0x06), 0x0)
  */
  IF OBJECT_ID(N'ForBinary.OperationOr') IS NOT NULL DROP FUNCTION ForBinary.OperationOr
GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集
  CREATE FUNCTION ForBinary.OperationOr -- 对左操作数和右操作数进行二进制按位“或”运算
(
  @left varbinary(max) , -- 左操作数
  @right varbinary(max) -- 右操作数
)
RETURNS varbinary(max)
AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.ForBinary].OperationOr
  GO
  
-----------------------------------------------------------------------------------------------------
-- 对左权限和右权限进行权限“或”运算
  /*
  PRINT ISNULL(ForBinary.PermissionOr(NULL, NULL), 0x0)
  PRINT ISNULL(ForBinary.PermissionOr(0x123, NULL), 0x0)
  PRINT ISNULL(ForBinary.PermissionOr(0x60, 0x06), 0x0)
  */
  IF OBJECT_ID(N'ForBinary.PermissionOr') IS NOT NULL DROP FUNCTION ForBinary.PermissionOr
GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集
  CREATE FUNCTION ForBinary.PermissionOr -- 对左权限和右权限进行权限“或”运算
(
  @left permission , -- 左权限
  @right permission -- 右权限
)
RETURNS permission
AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.ForBinary].OperationOr
  GO
  
-----------------------------------------------------------------------------------------------------
-- 将所有分配给某公司职员的身份角色格式化成一个字符串。
  /*
  PRINT IdentityRole.FormatRolesOfEmployee(1, NULL, NULL)
  PRINT IdentityRole.FormatRolesOfEmployee(1, '<a href="go.aspx?pkey={0}">{1}</a>', NULL)
  */
  IF OBJECT_ID(N'IdentityRole.FormatRolesOfEmployee') IS NOT NULL DROP FUNCTION IdentityRole.FormatRolesOfEmployee
GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集
  CREATE FUNCTION IdentityRole.FormatRolesOfEmployee -- 将所有分配给某公司职员的身份角色格式化成一个字符串
(
  @pkey int , -- 某公司职员的 PKey
  @format nvarchar(max) , -- 转换的格式字符串
  @separator nvarchar(max) -- 多个身份角色之间的分隔符
)
RETURNS nvarchar(max)
AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.IdentityRole].FormatRolesOfEmployee
  GO
  
-----------------------------------------------------------------------------------------------------
-- 使用指定的格式和分隔符将由指定的 SQL 语句所生成的结果集连接成一个字符串。
  /*
  PRINT ForTable.JoinResultSet('select * from sys.tables', NULL, NULL)
  PRINT ForTable.JoinResultSet('select * from TOperaPermiCategories', '{1} : {2}', char(13))
  */
  IF OBJECT_ID(N'ForTable.JoinResultSet') IS NOT NULL DROP FUNCTION ForTable.JoinResultSet
GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集
  CREATE FUNCTION ForTable.JoinResultSet -- 使用指定的格式和分隔符将由指定的 SQL 语句所生成的结果集连接成一个字符串
(
  @sql nvarchar(max) , -- 能生成结果集的 SQL 语句
  @format nvarchar(max) , -- 连接时为结果集中每一条记录所指定的格式
  @separator nvarchar(max) -- 连接时每一条记录之间的分隔符
)
RETURNS nvarchar(max)
AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.ForTable].JoinResultSet
  GO
  
-----------------------------------------------------------------------------------------------------
-- 使用指定的格式将由指定的 SQL 语句所生成的结果行连接成一个字符串。
  /*
  PRINT ForTable.JoinResultRow('select ''First'', ''Second'' ; ', NULL)
  PRINT ForTable.JoinResultRow('select 0 , 1 , 2 , 3 ; ', '{1} : {2}')
  */
  IF OBJECT_ID(N'ForTable.JoinResultRow') IS NOT NULL DROP FUNCTION ForTable.JoinResultRow
GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集
  CREATE FUNCTION ForTable.JoinResultRow -- 使用指定的格式将由指定的 SQL 语句所生成的结果行连接成一个字符串
(
  @sql nvarchar(max) , -- 能生成结果行的 SQL 语句
  @format nvarchar(max) -- 连接时所指定的格式
)
RETURNS nvarchar(max)
AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.ForTable].JoinResultRow
  GO
  
-----------------------------------------------------------------------------------------------------
-- 将指定的变体按指定的格式转换为字符串。
  /*
  PRINT ForVariant.Format(1.2345, '000.0000000')
  PRINT ForVariant.Format({d'2007-08-08'}, 'yyyy..MM..dd...')
  */
  IF OBJECT_ID(N'ForVariant.Format') IS NOT NULL DROP FUNCTION ForVariant.Format
GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集
  CREATE FUNCTION ForVariant.Format -- 将指定的变体按指定的格式转换为字符串
(
  @variant sql_variant , -- 要进行转换的变体对象
  @format nvarchar(max) -- 转换成字符串所使用的格式
)
RETURNS nvarchar(max)
AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.ForVariant].Format
  GO
  
-----------------------------------------------------------------------------------------------------
-- 检测在指定的调入仓库和调出仓库之间是否存在有效的的产品调拨操作。
  /*
  PRINT StockpileRelated.HasValidProductDispatchingOperation(1, 2)
  PRINT StockpileRelated.HasValidProductDispatchingOperation(4, 6)
  */
  IF OBJECT_ID(N'StockpileRelated.HasValidProductDispatchingOperation') IS NOT NULL DROP FUNCTION StockpileRelated.HasValidProductDispatchingOperation
GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集
  CREATE FUNCTION StockpileRelated.HasValidProductDispatchingOperation -- 检测在指定的调入仓库和调出仓库之间是否存在有效的的产品调拨操作
(
  @dispatchIn int , -- 指定的调入仓库的主键标识 PKey
  @dispatchOut int -- 指定的调出仓库的主键标识 PKey
)
RETURNS bit -- 如果在指定的调入仓库和调出仓库之间存在有效的的产品调拨操作则返回 true,否则返回 false
AS EXTERNAL NAME Assemblies.[Assemblies.Functions.ScalarValued.StockpileRelated].HasValidProductDispatchingOperation
  GO
  
-----------------------------------------------------------------------------------------------------
-- 获取所有对于指定的调入仓库有效的调出仓库。
  /*
  SELECT * FROM StockpileRelated.GetValidDispatchOutWarehouses(1)
  SELECT * FROM StockpileRelated.GetValidDispatchOutWarehouses(6)
  */
  IF OBJECT_ID(N'StockpileRelated.GetValidDispatchOutWarehouses') IS NOT NULL DROP FUNCTION StockpileRelated.GetValidDispatchOutWarehouses
GO -- 注意!记得复制此两行 SQL 语句到此脚本文件开始处,以便可以删除程序集
  CREATE FUNCTION StockpileRelated.GetValidDispatchOutWarehouses -- 获取所有对于指定的调入仓库有效的调出仓库
(
  @dispatchIn int -- 指定的调入仓库的主键标识 PKey
)
RETURNS TABLE (
  [PKey] int
)
AS EXTERNAL NAME Assemblies.[Assemblies.Functions.TableValued.StockpileRelated].GetValidDispatchOutWarehouses
  GO

来源:IT专家网    作者:Peak Wong    责编:豆豆技术应用

正在加载评论...