2016-10-21 3 views
0

мне нужна помощь, чтобы исправить мою проблему:хранимой процедуры для удаления повторяющихся строк

create procedure dbo.spDelDdup 
    (@field1 nvarchar(50)= null, 
    @field2 varchar(50), 
    @tblName varchar(50)) 
as 
BEGIN 
    WITH CTE (@field1, @field2, Duplicate_Record_Count) AS 
    (
     SELECT 
      @field1, @field2, 
      ROW_NUMBER() OVER(PARTITION BY @field1, @field2 ORDER BY @field1) AS Duplicate_Record_Count 
     FROM 
      @tblName 
    ) 
    DELETE FROM CTE 
    WHERE Duplicate_Record_Count > 1 
END 

Я получаю сообщение об ошибке:

Msg 102, Level 15, State 1, Procedure spDelDdup, Line 91
Incorrect syntax near '@field1'.

Было бы неплохо, чтобы исправить мою проблему

+3

Вы можете просто удалить '(@ field1, @ field2, Duplicate_Record_Count)'. Это необходимо, только если у вас нет уникальных имен столбцов в определении запроса в CTE. Кроме того, когда вы выбираете '@ field1' или любую переменную, вам нужно выполнить псевдоним в своем CTE. то есть 'select @ field1 как [someColumn]'. У вас также возникнут проблемы с попыткой передать имя таблицы в @tblName. Вам понадобится динамический SQL. – scsimon

ответ

1

Вам нужно используйте Dynamic SQL, как показано ниже:

Вы также указали @field1 как необязательный параметр которым вам нужно управлять, однако это немного странно. Но если это именно то, что вы хотите, оставьте комментарий, чтобы я обновил свой ответ на его основе.

create procedure dbo.spDelDdup 
(@field1 nvarchar(50)= null, 
@field2 varchar(50), 
@tblName varchar(50)) 
as 
BEGIN 
Declare @q AS Nvarchar(max) 
Set @q = N'WITH CTE ('[email protected]+', '[email protected]+', Duplicate_Record_Count) 
AS 
(
    SELECT '[email protected]+','[email protected]+', 
    ROW_NUMBER() OVER(PARTITION BY '[email protected]+','[email protected]+' ORDER BY '[email protected]+') AS Duplicate_Record_Count 
    FROM '[email protected]+' 
) 
DELETE 
FROM CTE 
WHERE Duplicate_Record_Count > 1' 

EXEC(@q); 

END 

Вы также можете использовать sp_executesql.