使用 JamesZ 的分割空间的建议,我重新利用了我在其他地方使用的旧函数。
CREATE FUNCTION [dbo].[tvf_CreateVarcharTableFromCsv]
(
@VarcharCsv VARCHAR(4000) ,
@Seperator VARCHAR(5) = NULL
)
RETURNS @VarcharTable TABLE
(
VarcharIndex VARCHAR(50) NOT NULL
)
AS
BEGIN
DECLARE @localVarcharIndexList VARCHAR(4000);
DECLARE @localSeperator VARCHAR(5);
SET @localVarcharIndexList = @VarcharCsv;
SET @localSeperator = @Seperator;
IF @localSeperator IS NULL
SET @localSeperator = ',';
/*****************************************************************************************
Parse CSVs into tables with CTE
http://www.simple-talk.com/sql/t-sql-programming/sql-server-2005-common-table-expressions/
*****************************************************************************************/
IF @localVarcharIndexList IS NOT NULL
BEGIN
WITH VarcharCsv ( i, j, VarcharIndex )
AS ( SELECT i = 1 ,
VarcharIndex = CHARINDEX(@localSeperator,
@localVarcharIndexList
+ @localSeperator) ,
SUBSTRING(@localVarcharIndexList, 1,
CHARINDEX(@localSeperator,
@localVarcharIndexList
+ @localSeperator)
- 1)
UNION ALL
SELECT i = j + 1 ,
j = CHARINDEX(@localSeperator,
@localVarcharIndexList
+ @localSeperator, j + 1) ,
SUBSTRING(@localVarcharIndexList,
j + 1,
CHARINDEX(@localSeperator,
@localVarcharIndexList
+ @localSeperator,
j + 1) - ( j + 1 ))
FROM VarcharCsv
WHERE CHARINDEX(@localSeperator,
@localVarcharIndexList
+ @localSeperator, j + 1) <> 0
)
INSERT INTO @VarcharTable
SELECT VarcharIndex
FROM VarcharCsv
OPTION ( MAXRECURSION 500 );
END;
RETURN;
END;
它可以像这样用于我的要求:
SELECT *
FROM [tvf_CreateVarcharTableFromCsv]('here is a string 123456 blah blah blah 5/09/2016"',
' ')
WHERE LEN(VarcharIndex) > 5
AND ISNUMERIC(VarcharIndex) = 1