2010-04-27 6 views
2

Мне нужно предоставить 4 хранимые процедуры MySQL для каждой таблицы в базе данных. Они предназначены для получения, обновления, вставки и удаления.Обновление записей из XML

«Получить», «удалить» и «вставить» просты. Проблема заключается в «обновлении», потому что я не знаю, какие параметры будут установлены, а какие нет. Некоторые параметры могут быть установлены в NULL, а другие просто не изменятся, поэтому они не будут предоставлены.

Поскольку я уже работаю с XML, после нескольких поисков в Google я обнаружил, что можно использовать функцию UpdateXML, но примеры слишком сложны, а некоторые статьи - с 2007 года. Поэтому я не узнайте, есть ли в этот момент более совершенная техника или что-то более простое.

Любой комментарий, документация, ссылки, статьи или что-то из чего-то, что вы использовали, и вы будете довольны, будут хорошо оценены: D

Приветствия.

ответ

1

Обычно, когда у вас есть данные из строки в вашей базе данных в интерфейсе, вы должны иметь все значения, которые вы можете использовать для обновления этой строки в базе данных. Вы должны передать все эти значения в свое обновление, независимо от того, действительно ли они были изменены. В противном случае ваша база данных не знает, получает ли она значение NULL для столбца, потому что это то, что оно должно быть, или потому, что вы просто не передали реальную стоимость.

Если у вас появятся области приложения, где вам не нужны определенные столбцы из таблицы, тогда можно настроить дополнительные хранимые процедуры, которые не используют эти столбцы. Часто бывает проще просто получить все столбцы из базы данных, когда вы заполняете свой внешний объект. Накладные расходы дополнительных столбцов обычно минимальны и заслуживают сохраненного обслуживания нескольких хранимых процедур обновления.

Вот пример. Это синтаксис MS SQL Server, так что вы, возможно, придется изменить его немного, но, надеюсь, он иллюстрирует идею:

CREATE PROCEDURE Update_My_Table 
    @my_table_id INT, 
    @name   VARCHAR(40), 
    @description VARCHAR(500), 
    @some_other_col INT 
AS 
BEGIN 
    UPDATE 
     My_Table 
    SET 
     name   = @name, 
     description = @description, 
     some_other_col = @some_other_col 
    WHERE 
     my_table_id = @my_table_id 
END 

CREATE PROCEDURE Update_My_Table_Limited 
    @my_table_id INT, 
    @name   VARCHAR(40), 
    @description VARCHAR(500) 
AS 
BEGIN 
    UPDATE 
     My_Table 
    SET 
     name   = @name, 
     description = @description 
    WHERE 
     my_table_id = @my_table_id 
END 

Как вы можете видеть, просто устранить те столбцы, которые вы не обновляя из инструкции UPDATE. Просто не переходите за борт и не пытайтесь хранить хранимую процедуру для каждой возможной комбинации столбцов, которую вы можете обновить. Гораздо проще просто получить дополнительные столбцы из БД, когда вы выбираете из таблицы в первую очередь. Вы в конечном итоге передаете то же значение обратно, и ваш сервер завершит обновление столбца с тем же точным значением, но это не имеет большого значения. Вы можете запрограммировать свой интерфейс, чтобы убедиться, что хотя бы один столбец был изменен, прежде чем он попытается обновить что-либо в базе данных.