SQL Server - 如何在查询中创建增量

时间:2014-05-05 20:19:42

标签: sql-server-2008-r2

首先,我使用的是SQL Server 2008 R2

我正在将数据从一个源移动到另一个源。在这种特殊情况下,有一个名为SiteID的字段。在源中,它不是必填字段,而是在目的地中。所以我想,当来自源的SiteID为NULL时,可以在运行中创建一个SiteID""在查询源数据期间。类似于状态的组合加上描述字段的前8个字符加上十位数字递增。

起初我认为使用日期/时间+纳秒的组合可能很容易,但事实证明,在纳秒内可以检索到几条记录,导致重复的SiteID。

我的第二个想法是创建一个包含一个标识字段和一个函数的表,该函数将添加一个记录来增加标识字段然后返回它(该函数还将删除标识字段小于最新字符的所有记录节省空间)。不幸的是,在我写完这篇文章之后,我试图创造"创造"函数我收到通知,函数中不允许插入INSERT。

我可以(并且确实)将其转换为存储过程,但在选择查询中不允许存储过程。

所以现在我被困了。

有没有办法完成我想要做的事情?

1 个答案:

答案 0 :(得分:0)

此脚本可能需要一段时间才能执行,具体取决于表中的数据,因此首先要对小样本数据集执行。

DECLARE  @TotalMissingSiteID INT = 0,
         @Counter INT = 0,
         @NewID BIGINT;
DECLARE @NewSiteIDs TABLE 
(
    SiteID BIGINT-- Check the datatype
);

SELECT @TotalMissingSiteID = COUNT(*)
FROM SourceTable
WHERE SiteID IS NULL;


WHILE(@Counter < @TotalMissingSiteID )
BEGIN

    WHILE(1 = 1)
    BEGIN

        SELECT @NewID = RAND()* 1000000000000000;-- Add your formula to generate new SiteIDs here

        -- To check if the generated SiteID is already present in the table
        IF ( ISNULL(( SELECT 1
                      FROM SourceTable
                      WHERE SiteID = @NewID),0) = 0 )
             BREAK;

    END

    INSERT INTO @NewSiteIDs (SiteID)
    VALUES (@NewID);

    SET @Counter = @Counter + 1;
END

INSERT INTO DestinationTable (SiteID)-- Add the extra columns here
SELECT ISNULL(MainTable.SiteID,NewIDs.SiteID) SiteID
FROM (
        SELECT SiteID,-- Add the extra columns here
               ROW_NUMBER() OVER(PARTITION BY SiteID
                                     ORDER BY SiteID) SerialNumber
        FROM SourceTable
     ) MainTable
LEFT JOIN ( SELECT SiteID,
                   ROW_NUMBER() OVER(ORDER BY SiteID) SerialNumber
            FROM @NewSiteIDs
           ) NewIDs
ON MainTable.SiteID IS NULL
AND MainTable.SerialNumber = NewIDs.SerialNumber