2013-10-25 8 views
0

Я использую MS SQL Server 2008, и мне нужно обновить длинный список имен в одной из таблиц. Я хотел бы передать список имен и обновить их, добавив к ним префикс. Скажем, я передаю X, Y, Z в хранимую процедуру и обновляет их до Disable_X, Disable_Y, Disable_Z.Обновление нескольких записей за один вызов

Я думаю, что параметры таблицы - это то, что я ищу, и я прочитал http://www.sommarskog.se/arrays-in-sql-2008.html#TVP_in_TSQL, но он говорит только о вставке нескольких параметров, и я пытаюсь обновить несколько записей, если они существуют. Я только начинаю изучать эти понятия, так кто-то может указать мне в правильном направлении?

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

+1

Непонятно, что вы хотите. Вам нужна хранимая процедура с параметром string (?) Или table (?), Который вы не можете позвонить, чтобы обновить таблицу? Или просто «обновление ... где ...» достаточно? –

+0

@OcasoProtal Извините, что недостаточно ясно. Я хотел бы вызвать хранимую процедуру со списком имен, которые я хочу обновить. Этот список может быть передан как TVP или список с запятой или любым другим способом, в зависимости от того, что проще реализовать. Если простое обновление, где комбинация может сделать трюк, который также прекрасен. – user2696565

ответ

0

Эта хранимая процедура ожидает строку, состоящую из разделенных запятыми имен. Преобразуйте эту строку в xml и используйте функциональность xml для получения списка всех элементов xml. Untested:

CREATE PROCEDURE [dbo].[MultiUpdate] 
( 
    @valuelist varchar(MAX) 
) AS 

    DECLARE @xml as xml 

    SET @xml = cast(('<X>'+replace(@valuelist,',' ,'</X><X>')+'</X>') as xml) 

    UPDATE yourtable SET name='DISABLE_'+name Where name in (SELECT N.value('.', 'varchar(10)') as value FROM @xml.nodes('X') as T(N)) 

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