SELECT *FROM #testenvironmentWHERE PARSENAME(CAST(yourdata AS NVARCHAR(MAX)),3) IS NULL
SELECT @HOLDER = IDFROM #testEnvironmentWHERE PARSENAME( CAST(yourData AS NVARCHAR(MAX)),3) IS NULLAND PARSENAME(CAST(yourData AS NVARCHAR(MAX)), 2) IS NOT NULL
Duration for CHARINDEX = 00:00:18:363Duration for LEN = 00:00:09:347Duration for PARSENAME = 00:00:06:870Duration for COLLATE = 00:00:06:667
SET NOCOUNT ON;IF object_id('tempdb..#testEnvironment') IS NOT NULLBEGIN DROP TABLE #testEnvironment;END; --1,000,000 Random rows of dataSELECT IDENTITY(INT,1,1) AS ID, CAST(LEFT(yourData, LEN(yourData) - 1) AS NTEXT) AS yourDataINTO #testEnvironmentFROM (SELECT TOP 1000000 REPLICATE( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(NEWID(),'-','') ,'0',''),'9',''),'8',''),'7',''),'6',''),'5',''),'4',''),'3',''),'2',''),'1','') + '.', (ABS(CHECKSUM(NEWID())) % 2) + 2) FROM master.dbo.syscolumns sc1, master.dbo.syscolumns sc2, master.dbo.syscolumns sc3 )a(yourData);DECLARE @HOLDER INT, @Duration CHAR(12), @StartTime DATETIME;DBCC FREEPROCCACHE WITH NO_INFOMSGS;DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;SELECT @StartTime = GETDATE();SELECT @HOLDER = IDFROM (SELECT ID, yourData, MAX(rn) FROM (SELECT ID, yourData, split.Part.value('text()[1]', 'VARCHAR(MAX)'), ROW_NUMBER() OVER(PARTITION BY yourData ORDER BY (SELECT NULL)) FROM (SELECT CAST('<p>' + REPLACE(CAST(yourData AS VARCHAR(MAX)) COLLATE Latin1_General_BIN2,'.','</p><p>') + '</p>' AS XML), CAST(yourData AS VARCHAR(MAX)), ID FROM #testEnvironment) innerQ(xmlField, yourData, ID) CROSS APPLY innerQ.xmlField.nodes('p') split(Part) ) a(ID, yourData,splitData,rn) GROUP BY ID, yourData ) a(ID, yourData, rn)WHERE rn = 2;SELECT @Duration = CONVERT(CHAR(12),GETDATE()-@StartTime,114);RAISERROR('Duration for ugly xml split = %s',0,1,@Duration) WITH NOWAIT;DBCC FREEPROCCACHE WITH NO_INFOMSGS;DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;SELECT @StartTime = GETDATE();SELECT @HOLDER = IDFROM #testEnvironmentWHERE CHARINDEX('.', yourData, CHARINDEX('.', yourData) + 1) = 0;SELECT @Duration = CONVERT(CHAR(12),GETDATE()-@StartTime,114);RAISERROR('Duration for CHARINDEX = %s',0,1,@Duration) WITH NOWAIT;DBCC FREEPROCCACHE WITH NO_INFOMSGS;DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;SELECT @StartTime = GETDATE();SELECT @HOLDER = IDFROM #testEnvironmentWHERE LEN(CAST(yourData AS NVARCHAR(MAX)))-1 = LEN(REPLACE(CAST(yourData AS NVARCHAR(MAX)) COLLATE Latin1_General_BIN2,'.',''));SELECT @Duration = CONVERT(CHAR(12),GETDATE()-@StartTime,114);RAISERROR('Duration for LEN = %s',0,1,@Duration) WITH NOWAIT;DBCC FREEPROCCACHE WITH NO_INFOMSGS;DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;SELECT @StartTime = GETDATE();SELECT @HOLDER = IDFROM #testEnvironmentWHERE CHARINDEX('.', yourData COLLATE Latin1_General_BIN2, CHARINDEX('.', yourData COLLATE Latin1_General_BIN2) + 1) = 0;SELECT @Duration = CONVERT(CHAR(12),GETDATE()-@StartTime,114);RAISERROR('Duration for CHARINDEX with COLLATE = %s',0,1,@Duration) WITH NOWAIT;DBCC FREEPROCCACHE WITH NO_INFOMSGS;DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;SELECT @StartTime = GETDATE();SELECT @HOLDER = IDFROM #testEnvironmentWHERE PARSENAME(CAST(yourData AS NVARCHAR(MAX)),3) IS NULLAND PARSENAME(CAST(yourData AS NVARCHAR(MAX)), 2) IS NOT NULL;SELECT @Duration = CONVERT(CHAR(12),GETDATE()-@StartTime,114);RAISERROR('Duration for PARSENAME = %s',0,1,@Duration) WITH NOWAIT;
Duration for ugly xml split = 00:00:47:197Duration for CHARINDEX = 00:00:07:593Duration for LEN = 00:00:08:163Duration for CHARINDEX with COLLATE = 00:00:04:787Duration for PARSENAME = 00:00:05:193
SELECT @StartTime = GETDATE();SELECT @HOLDER = IDFROM #testEnvironmentWHERE yourData like '%.%' and yourData not like '%.%.%';SELECT @Duration = CONVERT(CHAR(12),GETDATE()-@StartTime,114);RAISERROR('Duration for LIKE = %s',0,1,@Duration) WITH NOWAIT;DBCC FREEPROCCACHE WITH NO_INFOMSGS;DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;SELECT @StartTime = GETDATE();SELECT @HOLDER = IDFROM #testEnvironmentWHERE yourData COLLATE Latin1_General_BIN2 like '%.%' and yourData COLLATE Latin1_General_BIN2 not like '%.%.%';SELECT @Duration = CONVERT(CHAR(12),GETDATE()-@StartTime,114);RAISERROR('Duration for LIKE = %s',0,1,@Duration) WITH NOWAIT;
Duration for CHARINDEX = 00:00:09:103Duration for LEN = 00:00:10:790Duration for CHARINDEX with COLLATE = 00:00:06:507Duration for PARSENAME = 00:00:07:717Duration for LIKE = 00:00:10:703Duration for LIKE with COLLATE = 00:00:06:517
DBCC FREEPROCCACHE WITH NO_INFOMSGS;DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;DECLARE @HOLDER INT, @Duration CHAR(12), @StartTime DATETIME;SELECT @StartTime = GETDATE();SELECT @HOLDER = IDFROM #testEnvironmentWHERE dbo.RegexCLR(ISNULL(yourData,'')) = 1SELECT @Duration = CONVERT(CHAR(12),GETDATE()-@StartTime,114);RAISERROR('Duration for SQLCLR = %s',0,1,@Duration) WITH NOWAIT;
public partial class UserDefinedFunctions{ [Microsoft.SqlServer.Server.SqlFunction()] public static bool RegexCLR(string input) { return Regex.IsMatch(input,@"^[^\.]+\.[^\.]+$"); }};
public partial class UserDefinedFunctions{ static readonly Regex _regex = new Regex(@"^[^\.]+\.[^\.]+$", RegexOptions.Compiled); [Microsoft.SqlServer.Server.SqlFunction()] public static bool RegexCLR(string input) { return Regex.IsMatch(input); }};