T-SQL не является асинхронным, таким образом, у Вас действительно нет выбора, кроме как ожидать, пока SP2 не заканчивается. К счастью это - то, что Вы хотите.
CREATE PROCEDURE SP1 AS
EXEC SP2
PRINT 'Done'
Что ж, если у вас есть целые строки как дубликаты в вашей таблице, вы, по крайней мере, не настроили первичный ключ для этой таблицы, иначе, по крайней мере, значение первичного ключа будет другим.
Однако вот как создать SQL для получения дубликатов по набору столбцов:
SELECT col1, col2, col3, col4
FROM table
GROUP BY col1, col2, col3, col4
HAVING COUNT(*) > 1
Это позволит найти строки, которые для столбцов col1-col4 имеют одинаковую комбинацию значений более одного раза.
Для Например, в следующей таблице строки 2 + 3 будут дублироваться:
PK col1 col2 col3 col4 col5
1 1 2 3 4 6
2 1 3 4 7 7
3 1 3 4 7 10
4 2 3 1 4 5
Две строки имеют общие значения в столбцах col1-col4, и поэтому в этом SQL они считаются дубликатами. Разверните список столбцов, чтобы он содержал все столбцы, для которых вы хотите это проанализировать.
К слову, это не так. Просто сделайте оператор select, группирующий по всем полям таблицы и фильтрующий с помощью предложения Have, где счетчик больше 1.
Если ваши строки дублируются, кроме ключа, то не включайте ключ в выберите поля.
Если вы используете SQL Server 2005+, вы можете использовать следующий код для просмотра всех строк вместе с другими столбцами:
SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber
FROM table
Вы также можете удалить (или иным образом работать с) дубликаты используя эту технику:
WITH cte AS
(SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber
FROM table
)
DELETE FROM cte WHERE DuplicateRowNumber > 1
ROW_NUMBER чрезвычайно эффективен - вы можете многое с ним сделать - см. статью BOL на http://msdn.microsoft.com/en-us/library/ms186734.aspx