CTE更新永远

时间:2016-02-23 12:03:59

标签: sql-server-2008-r2

我有一个临时表,随机主机名填充如下:

CREATE TABLE #strings_temp (
stringtemp VARCHAR(30));

-- Create a temporary table with random strings with the same row count as table 2  
DECLARE @row INT;
DECLARE @TotalRows INT;
SET @row = 0;
SET @TotalRows = (Select DISTINCT COUNT(*) From table2) 

WHILE @row <= @TotalRows
BEGIN
INSERT INTO #strings_temp
(stringtemp)
   select char(rand()*26+65)+char(rand()*26+65)+char(rand()*26+65)
   +char(rand()*26+65)+char(rand()*26+65)+char(rand()*26+65)
   +char(rand()*26+65)+char(rand()*26+65)+char(rand()*26+65)
   +char(rand()*26+65)+char(rand()*26+65)+char(rand()*26+65)
   +char(rand()*26+65)+char(rand()*26+65)+char(rand()*26+65)+ 
   + '.' 
   +char(rand()*26+65)+char(rand()*26+65)+char(rand()*26+65)
                    +'.' + 'RANDOM.COM';
   SET @row = @row + 1;
 END;

然后我想使用CTE用临时表中的数据更新表2中的值,如下所示,但这需要花费大量时间:

-- Update the string field with the string from the temporary table

WITH Table2CTE AS
(
    SELECT  
            stringname,
            rn = ROW_NUMBER() OVER(ORDER BY NEWID()) 
    FROM table2
)
, SampleStringData AS
(
    SELECT  
             stringtemp,
             rn = ROW_NUMBER() OVER(ORDER BY NEWID())
    FROM #strings_temp

    CROSS JOIN Table2CTE
)
UPDATE m
SET      m.stringname = fn.stringtemp
FROM Table2CTE AS m

INNER JOIN SampleStringData AS fn
    ON fn.rn = m.rn

我哪里错了?

1 个答案:

答案 0 :(得分:1)

删除了CROSS JOIN并现已修复

-- Update the string field with the string from the temporary table

WITH Table2CTE AS
(
    SELECT  
           stringname,
           rn = ROW_NUMBER() OVER(ORDER BY NEWID()) 
    FROM table2
)
, SampleStringData AS
(
    SELECT  
             stringtemp,
             rn = ROW_NUMBER() OVER(ORDER BY NEWID())
    FROM #strings_temp
)
UPDATE m
SET      m.stringname = fn.stringtemp
FROM Table2CTE AS m

INNER JOIN SampleStringData AS fn
    ON fn.rn = m.rn