27,581
社区成员




-- Table structure for Sheet1
-- ----------------------------
IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[Sheet1]') AND type IN ('U'))
DROP TABLE [dbo].[Sheet1]
GO
CREATE TABLE [dbo].[Sheet1] (
[授课教师] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL
)
GO
-- ----------------------------
-- Records of Sheet1
-- ----------------------------
INSERT INTO [dbo].[Sheet1] ([授课教师]) VALUES (N'叶宏[112017],李广军[112123]')
GO
INSERT INTO [dbo].[Sheet1] ([授课教师]) VALUES (N'韩翔2[004041]')
GO
INSERT INTO [dbo].[Sheet1] ([授课教师]) VALUES (N'张文[334104],丁丁[334137],郭子健[334125],赵红[334110],杨数清[334101],王敏敏[334112],丹丹[334138]')
GO
INSERT INTO [dbo].[Sheet1] ([授课教师]) VALUES (N'张文[334104],丁丁[334137],郭子健[334125],郑娟娟[334108]')
GO
CREATE FUNCTION fn_test(@Text NVARCHAR(MAX))
RETURNS @t TABLE(Names NVARCHAR(MAX), Ids NVARCHAR(MAX))
AS
BEGIN
DECLARE @StartIndex INT; --开始查找的位置
DECLARE @FindIndex INT; --找到的位置
DECLARE @Content VARCHAR(MAX) = ''; --找到的值
DECLARE @Content_Ids NVARCHAR(MAX) = N'';
--初始化一些变量
SET @StartIndex = 1; --T-SQL中字符串的查找位置是从1开始的
SET @FindIndex = 0;
--开始循环查找字符串逗号
WHILE(@StartIndex <= LEN(@Text))
BEGIN
--查找字符串函数 CHARINDEX 第一个参数是要找的字符串
-- 第二个参数是在哪里查找这个字符串
-- 第三个参数是开始查找的位置
--返回值是找到字符串的位置
SELECT @FindIndex = CHARINDEX('[', @Text, @StartIndex);
--判断有没找到 没找到返回0
IF(@FindIndex = 0 OR @FindIndex IS NULL)
BEGIN
--如果没有找到者表示找完了
SET @FindIndex = LEN(@Text) + 1;
END;
--截取字符串函数 SUBSTRING 第一个参数是要截取的字符串
-- 第二个参数是开始的位置
-- 第三个参数是截取的长度
--@FindIndex-@StartIndex 表示找的的位置-开始找的位置=要截取的长度
--LTRIM 和 RTRIM 是去除字符串左边和右边的空格函数
SET @Content = @Content + ';' + LTRIM(RTRIM(SUBSTRING(@Text, @StartIndex, @FindIndex - @StartIndex)));
--初始化下次查找的位置
SET @StartIndex = @FindIndex + 1;
SELECT @FindIndex = CHARINDEX(']', @Text, @StartIndex);
SET @Content_Ids = @Content_Ids + N';'
+ LTRIM(RTRIM(SUBSTRING(@Text, @StartIndex, @FindIndex - @StartIndex)));
SET @StartIndex = @FindIndex + 1;
END;
--把找的的值插入到要返回的Table类型中
INSERT INTO @t(Names, Ids)
VALUES(STUFF(REPLACE(@Content, ',', ''), 1, 1, ''), STUFF(REPLACE(@Content_Ids, ',', ''), 1, 1, ''));
RETURN;
END;
GO
IF OBJECT_ID('fn_Str', 'fn') IS NOT NULL
DROP FUNCTION fn_Str;
GO
CREATE FUNCTION fn_Str
(
@Str NVARCHAR(1000)
,@RetType TINYINT=1 --返回1:简体中文;2:数字
)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @RetStr NVARCHAR(1000) =N''
,@Start INT
,@End INT
,@SplitLen TINYINT
,@End2 INT
,@Loop TINYINT =0;
SET @Loop=LEN(@Str) -LEN(REPLACE(@Str, '[', ''));
SELECT @Str += ','
,@SplitLen=CASE WHEN @RetType=1 THEN 0 ELSE 1 END;
SET @Start=CASE WHEN @RetType=1 THEN 1 ELSE CHARINDEX('[', @Str) +1 END;
SELECT @End2=CASE WHEN @RetType=1 THEN CHARINDEX('[', @Str, 1) ELSE CHARINDEX('],', @Str, @Start) END;
SET @End=@End2-@Start;
WHILE @Loop>0
BEGIN
SELECT @RetStr += N';'+SUBSTRING(@Str, @Start, @End)
,@Str=STUFF(@Str, 1, @End2+@SplitLen, '');
SET @Start=CASE WHEN @RetType=1 THEN CHARINDEX('],', @Str) +2 ELSE CHARINDEX('[', @Str) +1 END;
SELECT @End2=CASE WHEN @RetType=1 THEN CHARINDEX('[', @Str, 1) ELSE CHARINDEX('],', @Str, @Start) END;
SELECT @End=@End2-@Start
,@Loop -= 1;
END;
RETURN STUFF(@RetStr, 1, 1, '');
END;
GO
效果:
SELECT dbo.fn_Str([授课教师],1) AS 简体中文,dbo.fn_Str([授课教师],2) AS 数字 FROM [dbo].[Sheet1]
/*
简体中文 数字
叶宏;李广军 112017;112123
韩翔2 004041
张文;丁丁;郭子健;赵红;杨数清;王敏敏;丹丹 334104;334137;334125;334110;334101;334112;334138
张文;丁丁;郭子健;郑娟娟 334104;334137;334125;334108
*/
IF OBJECT_ID('fn_Str', 'fn') IS NOT NULL
DROP FUNCTION fn_Str;
GO
CREATE FUNCTION fn_Str
(
@Str NVARCHAR(1000)
,@RetType TINYINT=1 --返回1:简体中文;2:数字
)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @RetStr NVARCHAR(1000) =N''
,@Start INT
,@End INT
,@Split1 NVARCHAR(10)
,@Split2 NVARCHAR(10);
SELECT @Split1=CASE WHEN @RetType=1 THEN N'%[吖-座]%' ELSE '%[0-9]%' END,@Split2= CASE WHEN @RetType=1 THEN N'%[^吖-座]%' ELSE '%[^0-9]%' END;
SET @Start=PATINDEX(@Split1, @Str) ;
SELECT @Str=STUFF(@Str,1,@Start-1,''),@Start=1;
WHILE @Str>''
BEGIN
SET @End=PATINDEX(@Split2, @Str);
IF @End=0
SET @End=LEN(@Str)+1;
SELECT @RetStr+=N';'+SUBSTRING(@Str,@Start,@End-1),@Str=STUFF(@Str,1,@End-1,'');
IF @Str=''
BREAK
SET @Str=STUFF(@Str,1,PATINDEX(@Split1, @Str)-1,'');
SELECT @End=PATINDEX(@Split2, @Str),@Start=PATINDEX(@Split1, @Str);
IF @End=0
SET @End=LEN(@Str)+1
END;
RETURN STUFF(@RetStr,1,1,'');
END;
GO
SELECT dbo.fn_Str('123中国人78中国',1) AS 简体中文,dbo.fn_Str('123中国人78中国',2) AS 数字
GO
/*
简体中文 数字
中国人;中国 123;78
*/
SELECT a.授课教师
,STUFF(a.Cols.query('/R/Col[position() mod 2=1]/text()').value('.','nvarchar(1000)'),1,1,'') AS 姓名
,STUFF(a.Cols.query('/R/Col[position() mod 2=0]/text()').value('.','nvarchar(1000)'),1,1,'') AS 编号
FROM (SELECT *
,CONVERT(
XML
,'<R><Col>;'+REPLACE(REPLACE(REPLACE([授课教师], '[', '</Col><Col>;'), '],', '</Col><Col>;'), ']', '</Col></R>')) AS Cols
FROM [dbo].[Sheet1]) AS a
显示效果