1. 程式人生 > >PCB MS SQL表值函數與CLR 表值函數 (例:字符串分割轉表)

PCB MS SQL表值函數與CLR 表值函數 (例:字符串分割轉表)

splitstr arc 函數 reat sep 執行函數 urn mage init

將字符串分割為表表經常用到,這裏 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 表值函數 (例:字符串分割轉表)