--1. 创建fn_Split函数. ( 切分字符串, 返回一个列名为id的表 )
IF EXISTS(
SELECT *
FROM dbo.sysobjects
WHERE id = OBJECT_ID('fn_Split')
AND (TYPE = 'FN' OR TYPE = 'TF' OR TYPE = 'IF')
)
DROP FUNCTION fn_Split
GO
CREATE FUNCTION [dbo].[fn_Split]
(
@str VARCHAR(MAX),
@separator VARCHAR(10)
)
RETURNS TABLE
AS
RETURN
(
--Example: SELECT id FROM fn_Split('a,b,d,c',',')
SELECT B.id
FROM (
(
--A 的作用只是生成 '<v>a</v><v>b</v><v>d</v><v>c</v>' 的XML格式的数据, 提供数据源
SELECT [value] = CONVERT(XML, '<v>' + REPLACE(@str, @separator, '</v><v>') + '</v>')
) A
OUTER APPLY
(
--B 的作用是将A中的 XML 数据的值枚举出来转换成行
SELECT id = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/v') N(v)
) B
)
)
GO
IF EXISTS(
SELECT *
FROM dbo.sysobjects
WHERE id = OBJECT_ID('fn_Split')
AND (TYPE = 'FN' OR TYPE = 'TF' OR TYPE = 'IF')
)
DROP FUNCTION fn_Split
GO
CREATE FUNCTION [dbo].[fn_Split]
(
@str VARCHAR(MAX),
@separator VARCHAR(10)
)
RETURNS TABLE
AS
RETURN
(
--Example: SELECT id FROM fn_Split('a,b,d,c',',')
SELECT B.id
FROM (
(
--A 的作用只是生成 '<v>a</v><v>b</v><v>d</v><v>c</v>' 的XML格式的数据, 提供数据源
SELECT [value] = CONVERT(XML, '<v>' + REPLACE(@str, @separator, '</v><v>') + '</v>')
) A
OUTER APPLY
(
--B 的作用是将A中的 XML 数据的值枚举出来转换成行
SELECT id = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/v') N(v)
) B
)
)
GO