T- SQL 捕获数据溢出错误

T- SQL Capture data Overflow errors

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

我有一个源 table 正在与数据一起转储,列数据类型是 varchar

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

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

MS-SQL 2008 R2

是的。您可以通过在 SQL 服务器中使用 ISNUMERIC 插入到 destination table 之前检查 source table 列中的值是否为数字来实现。

来源TABLE

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'₤'

目的地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  

并且在查询到select和插入时,使用上面的函数

INSERT INTO #DESTINATION
SELECT SCOL
FROM #SOURCE
WHERE DBO.isReallyNumeric(SCOL)=1