首先,我使用的是SQL Server 2008 R2
我正在将数据从一个源移动到另一个源。在这种特殊情况下,有一个名为SiteID的字段。在源中,它不是必填字段,而是在目的地中。所以我想,当来自源的SiteID为NULL时,可以在运行中创建一个SiteID""在查询源数据期间。类似于状态的组合加上描述字段的前8个字符加上十位数字递增。
起初我认为使用日期/时间+纳秒的组合可能很容易,但事实证明,在纳秒内可以检索到几条记录,导致重复的SiteID。
我的第二个想法是创建一个包含一个标识字段和一个函数的表,该函数将添加一个记录来增加标识字段然后返回它(该函数还将删除标识字段小于最新字符的所有记录节省空间)。不幸的是,在我写完这篇文章之后,我试图创造"创造"函数我收到通知,函数中不允许插入INSERT。
我可以(并且确实)将其转换为存储过程,但在选择查询中不允许存储过程。
所以现在我被困了。
有没有办法完成我想要做的事情?
答案 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