Ssis 将整型转换为无符号整型

Ssis 将整型转换为无符号整型,ssis,sql-server-2012,msbi,Ssis,Sql Server 2012,Msbi,我在prod中有一个很大的表,带有INT数据类型,它既是主键又是标识列(1,1),行数是2147479257。 在日常作业运行期间,由于算术溢出错误,ETL失败,因为它无法将更多行放入目标表 请问如何将列更改为无符号整数。将数据类型更改为 bigint-2^63(-9223372036854775808)到2^63-1(9223372036854775807)您溢出了一个int,这意味着表中大约有2B行。通过切换到无符号整数,您希望再获得20亿行可寻址空间。这种方法的问题是SQL Server不

我在prod中有一个很大的表,带有INT数据类型,它既是主键又是标识列(1,1),行数是2147479257。 在日常作业运行期间,由于算术溢出错误,ETL失败,因为它无法将更多行放入目标表

请问如何将列更改为无符号整数。

将数据类型更改为


bigint-2^63(-9223372036854775808)到2^63-1(9223372036854775807)
您溢出了一个int,这意味着表中大约有2B行。通过切换到无符号整数,您希望再获得20亿行可寻址空间。这种方法的问题是SQL Server不支持将无符号int作为数据类型

你的本能反应可能是接触到格雷格的方法,改变成一个bigint数据类型。这种方法的挑战在于,当您的处理陷入困境时,您采取快速修复并更改为bigint,该表的任何其他使用者现在都将失败。顺便说一句,我是在2011年经历的。我们修复了数据库,结果所有的报表和.NET应用程序都失败了。在这项工作中,如果我们让处理过程排队N天,让它看起来正常,那么灾难性要远小于让每个面向外部的应用程序失败来消除所有疑问

通过标识列的一般实现,您可以在不进行任何代码更改的情况下轻松获得另一个2B—只需将标识值设置为下限,就可以为自己赢得足够的时间来计划到bigint的迁移。这个命令是

您可能还希望确保将标识列指定为唯一值。人们通常将标识列设置为主键,但在其他情况下,您可以运行类似于以下内容的代码

SET NOCOUNT ON;

IF EXISTS
(
    SELECT * FROM sys.tables AS T INNER JOIN sys.schemas AS S ON S.schema_id = T.schema_id WHERE S.name = 'dbo' AND T.name = 'IntOverfloweth'
)
BEGIN

    DROP TABLE 
        dbo.IntOverfloweth;
END

CREATE TABLE 
    dbo.IntOverfloweth
(
    IntOverflowethID int IDENTITY(2147483647,1) NOT NULL
,   SomeValue varchar(30)
);

INSERT INTO
    dbo.IntOverfloweth
(SomeValue)
OUTPUT
    Inserted.*
VALUES
('Before');


BEGIN TRY

    INSERT INTO
        dbo.IntOverfloweth
    (SomeValue)
    OUTPUT
        Inserted.*
    VALUES
    ('Overflow');

END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ErrorMessage;
END CATCH

-- Push the pointer back around to the begining 
DBCC CHECKIDENT('dbo.IntOverfloweth', RESEED, -2147483648);

-- Ensure uniqueness
CREATE UNIQUE INDEX UQ_IntOverfloweth
    ON dbo.IntOverfloweth
(
    IntOverflowethID
);

INSERT INTO
    dbo.IntOverfloweth
(SomeValue)
OUTPUT
    Inserted.*
VALUES
('Does not Overflow');

把它改成bigint怎么样?嗨,Billinkc,谢谢你的帮助,不过我的专栏是主键identity@deepak如果标识列也是主键,则此方法适用。唯一索引创建适用于身份不是主键的罕见情况。