Sql 重新创建所有授权/同义词/触发器/索引/FKs/。。。(或截断原始文件并从新文件中插入或选择)

Sql 重新创建所有授权/同义词/触发器/索引/FKs/。。。(或截断原始文件并从新文件中插入或选择),sql,sql-update,temp-tables,Sql,Sql Update,Temp Tables,显然,这会带来相当大的开销,但如果您想更新/清除数百万行,这将是最快的方法。我对使用的语法理解不够透彻,无法给出准确的答案,但这里有一种方法 确定要保留的行(例如,选择值,…from..where…) 识别时执行更新逻辑(例如,选择值+1…从…何处…) 不要将select插入到新表中 删除原始文件,将新文件重命名为原始文件,重新创建所有授权/同义词/触发器/索引/FKs/。。。(或截断原始文件并从新文件中插入或选择) 显然,这会带来相当大的开销,但如果您想更新/清除数百万行,这将是最快的方法。同

显然,这会带来相当大的开销,但如果您想更新/清除数百万行,这将是最快的方法。

我对使用的语法理解不够透彻,无法给出准确的答案,但这里有一种方法

确定要保留的行(例如,选择值,…from..where…)

识别时执行更新逻辑(例如,选择值+1…从…何处…)

不要将select插入到新表中

删除原始文件,将新文件重命名为原始文件,重新创建所有授权/同义词/触发器/索引/FKs/。。。(或截断原始文件并从新文件中插入或选择)


显然,这会带来相当大的开销,但如果您想更新/清除数百万行,这将是最快的方法。

同意,虽然TSQL包含循环,但它没有针对循环进行优化。如果这是特定于Microsoft SQL server的,请标记为SQL server。要么这样,要么我就放弃,忽略标记SQL。同意,虽然TSQL包含循环,但它并没有针对循环进行优化。如果这是特定于Microsoft SQL server的,请标记为SQL server。要么这样,要么我就放弃,忽略标记SQL。
CREATE TABLE #tmp_ImportedData_GenericData
(
    Id int identity(1,1),
    tmpCode varchar(255)  NULL,
    tmpAlpha3Code varchar(50)  NULL,
    tmpRelatedYear int NOT NULL,
    tmpPreviousValue varchar(255)  NULL,
    tmpGrowthRate varchar(255)  NULL
)

INSERT INTO #tmp_ImportedData_GenericData
SELECT
    MCS_ImportedData_GenericData.Code, 
MCS_ImportedData_GenericData.Alpha3Code,
MCS_ImportedData_GenericData.RelatedYear,
MCS_ImportedData_GenericData.PreviousValue,
MCS_ImportedData_GenericData.GrowthRate
FROM MCS_ImportedData_GenericData
INNER JOIN
(
    SELECT CODE, ALPHA3CODE, RELATEDYEAR, COUNT(*) AS NUMROWS
    FROM MCS_ImportedData_GenericData AS M
    GROUP BY M.CODE, M.ALPHA3CODE, M.RELATEDYEAR
    HAVING count(*) > 1
) AS M2 ON MCS_ImportedData_GenericData.CODE = M2.CODE
    AND MCS_ImportedData_GenericData.ALPHA3CODE = M2.ALPHA3CODE
    AND MCS_ImportedData_GenericData.RELATEDYEAR = M2.RELATEDYEAR
WHERE
(MCS_ImportedData_GenericData.PreviousValue <> 'INDEFINITO')

 -- SELECT * from #tmp_ImportedData_GenericData
 -- DROP TABLE #tmp_ImportedData_GenericData

DECLARE @counter int
DECLARE @rowsCount int

SET @counter = 1

SELECT @rowsCount =  count(*) from #tmp_ImportedData_GenericData
-- PRINT @rowsCount

WHILE @counter  < @rowsCount
BEGIN
    SELECT 
        @Code = tmpCode, 
        @Alpha3Code = tmpAlpha3Code, 
        @RelatedYear = tmpRelatedYear, 
        @OldValue = tmpPreviousValue, 
        @GrowthRate = tmpGrowthRate 
    FROM 
        #tmp_ImportedData_GenericData
    WHERE 
        Id = @counter

    DELETE FROM MCS_ImportedData_GenericData 
    WHERE 
        Code = @Code 
        AND Alpha3Code = @Alpha3Code  
        AND RelatedYear = @RelatedYear  
        AND PreviousValue <> 'INDEFINITO' OR PreviousValue IS NULL  

    UPDATE 
        MCS_ImportedData_GenericData 
        SET 
          PreviousValue = @OldValue, GrowthRate = @GrowthRate 
    WHERE 
        Code = @Code 
        AND Alpha3Code = @Alpha3Code  
        AND RelatedYear = @RelatedYear  
        AND MCS_ImportedData_GenericData.PreviousValue ='INDEFINITO'

    SET @counter = @counter + 1
END
WITH q AS (
        SELECT  m.*, ROW_NUMBER() OVER (PARTITION BY CODE, ALPHA3CODE, RELATEDYEAR ORDER BY CASE WHEN PreviousValue = 'INDEFINITO' THEN 1 ELSE 0 END)
        FROM    MCS_ImportedData_GenericData m
        WHERE   PreviousValue <> 'INDEFINITO'
        )
DELETE
FROM    q
WHERE   rn > 1
DELETE
   [data]
FROM
   MCS_ImportedData_GenericData AS [data]
WHERE
   id > (
         SELECT
            MIN(id)
         FROM
            MCS_ImportedData_GenericData
         WHERE
            CODE = [data].CODE
            AND ALPHA3CODE = [data].ALPHA3CODE
            AND RELATEDYEAR = [data].RELATEDYEAR
        )
DELETE
   [data]
FROM
   MCS_ImportedData_GenericData AS [data]
INNER JOIN
(
   SELECT
      MIN(id) AS [id],
      CODE,
      ALPHA3CODE,
      RELATEDYEAR
   FROM
      MCS_ImportedData_GenericData
   GROUP BY
      CODE,
      ALPHA3CODE,
      RELATEDYEAR
)
AS [original]
   ON [original].CODE = [data].CODE
   AND [original].ALPHA3CODE = [data].ALPHA3CODE
   AND [original].RELATEDYEAR = [data].RELATEDYEAR
   AND [original].id <> [data].id