码迷,mamicode.com
首页 > 数据库 > 详细

PCB MS SQL表值函数与CLR 表值函数 (例:字符串分割转表)

时间:2018-07-20 23:35:34      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:code   rmi   result   分割   分享图片   value   var   eth   注册   

将字符串分割为表表经常用到,这里 SQL表值函数与CLR  表值函数,两种实现方法例出来如下:

 

SELECT * FROM FP_EMSDB_PUB.dbo.SqlSplit(/,1oz/1.5oz/2oz/3oz)

效果如下:

 技术分享图片

 

SQL实现表值函数

CREATE FUNCTION [dbo].[splitStr](
@s   varchar(max),   --待分拆的字符串
@split varchar(10)     --数据分隔符
)RETURNS @re TABLE(id int IDENTITY(1,1), col varchar(max)) --建立临时表保存分割后的字符
AS
BEGIN
 DECLARE @splitlen int
 SET @splitlen=LEN(@split+a)-2
 WHILE CHARINDEX(@split,@s)>0
 BEGIN
  INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
  SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,‘‘)
 END
 INSERT @re VALUES(@s)
 RETURN
END

 

 

创建CLR 表值函数

    --注册表值函数 SqlSplit
    CREATE FUNCTION[dbo].[SqlSplit] (@separator NVARCHAR(32),@string NVARCHAR(MAX))
    RETURNS TABLE
    (
        SerialNumber INT,
        StringValue NVARCHAR(1024)
    )
    WITH EXECUTE AS CALLER        --用于在用户在执行函数的时候对引用的对象进行权限检查
    AS
    EXTERNAL NAME[SQLfunctionAssembly].[SQLClr.SQLfunction].[SqlSplit]    --EXTERNAL NAME 程序集名.类名.方法名
    GO

 

CLR实现表值函数

 public partial class SQLfunction
    {
        /// <summary>
        /// SQL Server 字符串分割方法
        /// </summary>
        /// <param name="separator"></param>
        /// <param name="pendingString"></param>
        /// <returns></returns>
        [Microsoft.SqlServer.Server.SqlFunction(
            DataAccess = DataAccessKind.Read,
            IsDeterministic = true,
            Name = "SqlSplit",
            FillRowMethodName = "SqlSplit_FillRow",
            TableDefinition = "SerialNumber int,StringValue nvarchar(1024)")]
        public static IEnumerable SqlSplit(SqlString separator, SqlString pendingString)
        {
            string _separator = string.Empty;
            string _pendingString = string.Empty;
            if (pendingString.IsNull) return null;
            _pendingString = pendingString.ToString();
            if (string.IsNullOrEmpty(_pendingString)) return null;
            _separator = separator.IsNull ? "," : separator.ToString();
            _separator = string.IsNullOrEmpty(_separator) ? "," : _separator;
            string[] strs = _pendingString.Split(new string[] { _separator }, StringSplitOptions.RemoveEmptyEntries);
            List<ResultData> resultDataList = new List<ResultData>();
            for (int i = 0; i < strs.Length; i++)
            {
                resultDataList.Add(new ResultData(i + 1, strs[i]));
            }
            return resultDataList;
        }

        /// <summary>
        /// 填充数据方法
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="serialNumber"></param>
        /// <param name="stringValue"></param>
        public static void SqlSplit_FillRow(Object obj, out SqlInt32 SerialNumber, out SqlString StringValue)
        {
            ResultData resultData = (ResultData)obj;
            SerialNumber = resultData.SerialNumber;
            StringValue = resultData.StringValue;
        }

        /// <summary>
        /// 定义返回类型
        /// </summary>
        public class ResultData
        {
            /// <summary>
            /// 序号,即行号
            /// </summary>
            public SqlInt32 SerialNumber { get; set; }

            /// <summary>
            /// 分割后的每个子字符串
            /// </summary>
            public SqlString StringValue { get; set; }

            public ResultData(SqlInt32 serialNumber, SqlString stringValue)
            {
                SerialNumber = serialNumber;
                StringValue = stringValue;
            }
        }
    }

 

PCB MS SQL表值函数与CLR 表值函数 (例:字符串分割转表)

标签:code   rmi   result   分割   分享图片   value   var   eth   注册   

原文地址:https://www.cnblogs.com/pcbren/p/9344525.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!