2010-11-29 4 views
2

Я пытаюсь написать хранимую процедуру в SQL Server (2005), чтобы сделать что-то, что звучит просто, но на самом деле мне кажется сложнее, чем я думал.TSQL Stored Proc для копирования записей (с помощью твиста!)

У меня есть стол с 30 колонками и 50 000 строк.

Число записей фиксировано, но пользователи могут редактировать поля существующих записей.

Чтобы сохранить их, чтобы повторно использовать повторяющиеся данные, я хочу дать им возможность выбрать запись и указать диапазон идентификаторов, чтобы скопировать эти данные в.

В SP, который я пытаюсь записать, выберете 3 параметра: первичный ключ записи источника и нижний и верхний первичные ключи диапазона записей, в которые будут скопированы данные.

Очевидно, что PK записей назначения остаются неизменными.

Итак, я решил, что SP должен выполнить SELECT - чтобы получить все данные, которые нужно скопировать, и UPDATE - для записи данных в указанные записи назначения.

Я просто не знаю, как сохранить результаты SELECT, чтобы сложить их в UPDATE. Временная таблица не помогла бы - выбор из этого будет таким же, как выбор из таблицы!

Что мне нужно, это переменная, которая фактически одна запись, так что я могу пойти что-то вроде:

@tempRECORD = SELECT * FROM SOURCETABLE WHERE ID = @sourcePK 

UPDATE SOURCETABLE 
SET FIELD1 = @tempRECORD.FIELD1, 
    FIELD2 = @tempRECORD.FIELD2, 
    ... 
    FIELD30 = @tempRECORD.FIELD30 
WHERE ID >= @LOWER_id AND ID <= @UPPER_id 

Но я не знаю, как, или если вы даже можете.
Я также открыт для любого другого умного способа, о котором я даже не думал!

Спасибо, ребята!

ответ

2

Поэтому я решил, что SP должен выполнить SELECT - чтобы все данные должны быть скопированы, а UPDATE - для записи данных в указанные записи назначения.

Что вам нужно, это T-SQL-специальное расширение для UPDATE, UPDATE ... FROM:

UPDATE T 
SET 
    Field1 = source.Field1 
    , Field2 = source.Field2 
    , Field3 = source.Field3 
FROM 
    (SELECT * FROM T AS source_T WHERE source_T.ID = @sourcePK) as source 
WHERE 
    T.ID BETWEEN @LOWER_Id AND @UPPER_Id 

Обратите внимание, что эта способность поставить условие FROM в UPDATE утверждения не стандарт ANSI SQL, поэтому я не знаю, как это будет сделано в других СУБД.

+0

Блестящий! Большое спасибо. – Merlin 2010-11-30 02:11:36

1

Я довольно уверен, что это не самый простой способ сделать это, но он должен работать без каких-либо проблем:

DECLARE @tempField1 varchar(255) 
DECLARE @tempField2 varchar(255) 
... 
DECLARE @tempField30 varchar(255) 

SELECT @tempField1 = FIELD1, @tempField2 = FIELD2, ... ,@tempField30 = FIELD30 FROM SOURCETABLE WHERE ID = @sourcePK 

UPDATE SOURCETABLE 
SET FIELD1 = @tempField1, 
    FIELD2 = @tempField2, 
    ... 
    FIELD30 = @tempField30 
WHERE ID >= @LOWER_id AND ID <= @UPPER_id 

Вы должны были бы изменить переменные tempField так, что они имеют правильный тип.

Смежные вопросы