【发布时间】:2015-11-09 14:56:16
【问题描述】:
我正在运行更新脚本来混淆数据,并且偶尔会遇到算术溢出错误消息,如标题所示。正在更新的表有 260k 条记录,但更新脚本需要运行多次才能产生错误。虽然它非常罕见,但在修复之前我不能依赖代码,因为调试起来很痛苦。
查看其他类似问题,这通常可以通过在表格或计算中将数据类型从 INT 更改为 BIGINT 来解决。但是,我看不出在哪里可能需要这样做。我已将脚本简化为以下内容,因为我已设法将其指向一列的更新。
更新正在调用一个函数,我已将其包含在下面。我怀疑,由于错误的随机性,使用 NEW_ID 函数可能会导致它,但是当我多次运行这部分函数时,我无法重新创建错误。 NEW_ID 函数不能在函数中使用,因此它是从视图中调用的,也包括在下面。
更新脚本:
UPDATE dbo.Addresses
SET HouseNumber = CASE WHEN LEN(HouseNumber) > 0
THEN dbo.fn_GenerateRandomString (LEN(HouseNumber), 1, 1, 1)
ELSE HouseNumber
END
NEW_ID 视图和随机字符串函数
CREATE VIEW dbo.vw_GetNewID
AS
SELECT NEWID() AS New_ID
CREATE FUNCTION dbo.fn_GenerateRandomString (
@stringLength int,
@upperCaseBit bit,
@lowerCaseBit bit,
@numberBit bit
)
RETURNS nvarchar(100)
AS
BEGIN
-- Sanitise string length values.
IF ISNULL(@stringLength, -1) < 0
SET @stringLength = 0
-- Generate a random string from the specified character sets.
DECLARE @string nvarchar(100) = ''
SELECT
@string += c2
FROM
(
SELECT TOP (@stringLength) c2 FROM (
SELECT c1 FROM
(
VALUES ('A'),('B'),('C')
) AS T1(c1)
WHERE @upperCaseBit = 1
UNION ALL
SELECT c1 FROM
(
VALUES ('a'),('b'),('c')
) AS T1(c1)
WHERE @lowerCaseBit = 1
SELECT c1 FROM
(
VALUES ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9')
) AS T1(c1)
WHERE @numberBit = 1
)
AS T2(c2)
ORDER BY (SELECT ABS(CHECKSUM(New_ID)) from vw_GetNewID)
) AS T2
RETURN @string
END
地址表(用于测试):
CREATE TABLE dbo.Addresses(HouseNumber nchar(32) NULL)
INSERT Addresses(HouseNumber)
VALUES ('DSjkmf jkghjsh35hjk h2jkhj3h jhf'),
('SDjfksj3548 ksjk'),
(NULL),
(''),
('2a'),
('1234567890'),
('An2b')
注意:地址表中只有 7k 行输入了值,即LEN(HouseNumber) > 0。
【问题讨论】:
标签: sql sql-server sql-server-2012