目标 - 捕获从源到目标的数据溢出错误。
我有一个使用数据转储的源表,列数据类型是varchar
虽然目标表具有特定的列类型,如decimal(12,5)或Int等...
无论如何,我可以找到所有不符合规范的行并标记它,以便它们不是插入的一部分,因此不会导致脚本失败..
MS-SQL 2008 R2
答案 0 :(得分:1)
是。您可以通过在SQL Server中使用source table
插入destination table
之前检查ISNUMERIC
列中的值是否为数字来执行此操作。
消息来源
CREATE TABLE #SOURCE(SCOL VARCHAR(300))
INSERT INTO #SOURCE
SELECT 'ABC'
UNION ALL
SELECT '121'
UNION ALL
SELECT '-145.78'
UNION ALL
SELECT '200,000'
UNION ALL
SELECT N'£100.20'
UNION ALL
SELECT '0E0'
UNION ALL
SELECT N'₤'
DESTINATION TABLE
CREATE TABLE #DESTINATION(DCOL NUMERIC(5,2))
-- Only the numeric values will be inserted and is Type-safe
INSERT INTO #DESTINATION
SELECT SCOL
FROM #SOURCE
WHERE ISNUMERIC(SCOL)=1
SELECT * FROM #DESTINATION
编辑:
如果ISNUMERIC
不满足列中的值,请创建以下函数并检查WHERE
子句中列中的值。我从here获得了这个功能。
CREATE FUNCTION dbo.isReallyNumeric
(
@num VARCHAR(64)
)
RETURNS BIT
BEGIN
IF LEFT(@num, 1) = '-'
SET @num = SUBSTRING(@num, 2, LEN(@num))
DECLARE @pos TINYINT
SET @pos = 1 + LEN(@num) - CHARINDEX('.', REVERSE(@num))
RETURN CASE
WHEN PATINDEX('%[^0-9.-]%', @num) = 0
AND @num NOT IN ('.', '-', '+', '^')
AND LEN(@num)>0
AND @num NOT LIKE '%-%'
AND
(
((@pos = LEN(@num)+1)
OR @pos = CHARINDEX('.', @num))
)
THEN
1
ELSE
0
END
END
GO
在要选择和插入的查询中,使用上面的函数
INSERT INTO #DESTINATION
SELECT SCOL
FROM #SOURCE
WHERE DBO.isReallyNumeric(SCOL)=1