PCB MS SQL表值函數與CLR 表值函數 (例:字符串分割轉表)
阿新 • • 發佈:2018-07-21
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 CREATEFUNCTION[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 表值函數 (例:字符串分割轉表)