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
目标 - 捕获从源表到目标表的数据溢出错误。
我有一个源 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