C XML решение будет выглядеть примерно так:
CREATE PROCEDURE dbo.ctf_sel_CertGoodItem
@id_list xml
AS
DECLARE @id_list_handler int
EXEC sp_xml_preparedocument @id_list_handler OUTPUT, @id_list
SELECT
p.id_postavka,
p.seria,
p.date
FROM
Postavka p
WHERE
p.id_postavka IN
(SELECT id
FROM
OPENXML(@id_list_handler, '/list/item')
WITH(
id int))
EXEC sp_xml_removedocument @id_list_handler
GO
Вызов этой процедуры простой - нужно XML заявленной структуры передать в параметр как строчку, например:
EXEC ctf_sel_CertGoodItem '<list><item id="57"/><item id="58"/></list>'
Путь к "записям", хранящимся в XML, определён как "/list/item" - это означает все записи с именем тэга "item" внутри тэга "list" (названия тэгов могут быть произвольными). Поля записи задаются атрибутами (по умолчанию это так, но у OPENXML есть флаговый параметр, в примере пропущенный, который позволяет переключиться с атрибутно-ориентированного представления в элемент-ориентированное представление XML-документа). Названия атрибутов элемента "item" определяют названия полей, и в секции WITH описываются их типы и задаётся полный перечень полей как для таблицы.
Наличие элемента "list" - скорее дань соглашению, что любое множество обрамляется тэгом, описывающим это множество, нежели необходимость.
Вызов системных процедур sp_xml_preparedocument и sp_xml_removedocument обязателен - они управляют жизнью дескриптора XML-документа, по которому SQL Server его регистрирует внутри себя на время работы. Вообще, это осталось с 2000-й версии - там было всё то же самое, только не было типа данных xml. Возможно, в будущих версиях эти дескрипторы уберут.