T-SQL捕获数据溢出错误

时间:2015-01-30 07:49:31

标签: sql-server sql-server-2008 sql-server-2008-r2

目标 - 捕获从源到目标的数据溢出错误。

我有一个使用数据转储的源表,列数据类型是varchar

虽然目标表具有特定的列类型,如decimal(12,5)或Int等...

无论如何,我可以找到所有不符合规范的行并标记它,以便它们不是插入的一部分,因此不会导致脚本失败..

MS-SQL 2008 R2

1 个答案:

答案 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