squvi.87 (9/24/2015)
what we could do to get the expected output?
Assuming that your string date is in 'yyyymmdd' format then you could do:
SELECTTestDate,
ISDATE(TestDate) AS [IsDate?],
CASE WHEN TestDate LIKE '[12][0-9][0-9][0-9][01][0-9][0-3][0-9]'
THEN 'RegExOK' ELSE 'RegExBad' END,
CASE WHEN TestDate LIKE '[12][0-9][0-9][0-9][01][0-9][0-3][0-9]'
AND IsDate(TestDate) = 1
THEN 'Valid' ELSE 'Invalid' END
FROM
(
SELECT'2000' AS [TestDate]-- Valid year of IsDate() but fails RegEx
UNION ALL SELECT '20001231'-- Valid
UNION ALL SELECT '20000231'-- Passes reges, Feb. does not have 31 days!
UNION ALL SELECT '20009999'-- Fails regex
) AS X
TestDate IsDate?
-------- ----------- -------- -------
2000 1 RegExBad Invalid
20001231 1 RegExOK Valid
20000231 0 RegExOK Invalid
20009999 0 RegExBad Invalid