TSQL Stored Proc для копирования записей (с изюминкой!) - PullRequest
2 голосов
/ 29 ноября 2010

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

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

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

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

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

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

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

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

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

@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 ]

2 голосов
/ 29 ноября 2010

Итак, я подумал, что SP должен сделать SELECT - чтобы получить все данные для копирования, и ОБНОВЛЕНИЕ - чтобы записать данные в указанные записи назначения.

Чтовам нужно расширение, специфичное для 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, поэтому я не знаю, как это будет сделано в других РСУБД.

1 голос
/ 29 ноября 2010

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

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, чтобы они имели правильный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...