編集、ISDATE() の使用は、検証、アプローチの変更に意味があります。
その変換エラーに関して、私が推測できるのは、一部のデータが一部の日付/時刻の「ルール」を満たしていないということだけです。それを念頭に置いて、おそらくこれらの条件の発見のためにこのようなことを試してみてください。単純ですが参考になるかもしれません。あなたが扱っているレコードの数がわからず、これが超高速になるとは言いませんので、最初にこれを count(*) として実行できることに注意してください。
SELECT
yyyymmddxxxxxx
, CASE WHEN isdate( (yyyy + '0101') ) = 0
OR ( yyyy < '1960' OR yyyy > '2020' ) THEN yyyy ELSE '' END AS yyyy
, CASE WHEN isdate( (yyyy + mm + '01') ) = 0 THEN mm ELSE '' END AS mm
, CASE WHEN isdate( (yyyy + mm + dd) ) = 0 THEN dd ELSE '' END AS dd
, CASE WHEN ( hh > '23' ) THEN hh ELSE '' END AS hh
, CASE WHEN ( mi > '59' ) THEN mi ELSE '' END AS mi
, CASE WHEN ( ss > '59' ) THEN ss ELSE '' END AS ss
FROM your_table
CROSS apply (SELECT convert(varchar(14), yyyymmddxxxxxx)) AS ca1 (int2str)
CROSS apply (SELECT
substring(int2str, 1,4) -- yyyy
, substring(int2str, 5,2) -- mm
, substring(int2str, 7,2) -- dd
, substring(int2str, 9,2) -- hh
, substring(int2str,11,2) -- mi
, substring(int2str,13,2) -- ss
) AS ca2 (yyyy,mm,dd,hh,mi,ss)
WHERE ISDATE(convert(varchar(8),int2str,112)) = 0
OR ISDATE( (hh + ':' + mi + ':' + ss) ) = 0
OR ( yyyy < '1960' OR yyyy > '2020' ) -- arbitrary, ignore of change to suit
;
http://sqlfiddle.com/#!3/9ab73/1出力は次のようになります。
| YYYYMMDDXXXXXX | YYYY | MM | DD | HH | MI | SS |
|----------------|------|----|----|----|----|----|
| 99990410123456 | 9999 | | | | | |
| 20149910123456 | | 99 | 10 | | | |
| 20140499123456 | | | 99 | | | |
| 20140410993456 | | | | 99 | | |
| 20140410129956 | | | | | 99 | |
| 20140410123499 | | | | | | 99 |
| 20140231123499 | | | 31 | | | |