【问题标题】:T- SQL Capture data Overflow errorsT- SQL 捕获数据溢出错误
【发布时间】:2015-01-30 07:49:30
【问题描述】:

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

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

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

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

MS-SQL 2008 R2

【问题讨论】:

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


【解决方案1】:

是的。您可以在 SQL Server 中使用ISNUMERIC 插入destination table 之前检查source 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'₤'

目的地表

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

【讨论】:

  • ISNUMERIC 不是很可靠 - 它将许多非数字字符串视为数字 - 请参阅 simple-talk.com/blogs/2011/01/13/…。较新版本的 SQL Server 提供 TRY_PARSE,但在 SQL 2008 R2 中不可用。
  • 我已经更新了 ISNUMERIC 的替代品。您现在可以查看@Ed Harper
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
相关资源
最近更新 更多