Деякі приклади використання XML (исходники), Різне, Програмування, статті

Передача набору рядків в збережену процедуру:


Вам необхідно багаторазово передавати табличний результат в збережену процедуру. Незважаючи на те, що SQL Server 2000 і SQL Server 2005 мають тип даних, який називається табличній змінної, Ви не можете використовувати її як параметр в збережених процедурах. Починаючи з версії SQL 2000, Microsoft все в більшій мірі підтримує XML. Я знаю, що більшість з Вас вже використало XML або, по крайней мере, багато чуло про XML, а проте я не хочу заглиблюватися в XML, а лише хочу показати Вам варіанти його використання. Для тих з Вас, хто не знайомий з XML, наступна посилання дасть гарний введення в предмет: www.topxml.com/sql/learn_sql_server_xml_tutorial.asp


Отже, почнемо. Нехай є наступна таблиця:


CREATE TABLE Employee (empid INT,
name VARCHAR (20),
salary MONEY NOT NULL
)


І ми хочемо вставити наступний список співробітників в таблицю employee:


Empid      Name      Salary
1      John          $10000.00
2      Joseph      $3000.00
3      Melissa      $2500.00
4      Dan             $2000.00


Для цього ми створимо збережену процедуру, щоб виконати обробку XML. Новий тип даних XML, введений в SQL 2005, є найбільш підходящим для того, щоб зберігати значення XML. Замість цього Ви можете також використовувати VARCHAR (MAX) або, якщо Ви використовуєте SQL 2000, то VARCHAR (8000).


Create PROC usp_ProcessRowset @p XML
AS
SET NOCOUNT ON
DECLARE @ih INT

EXEC sp_XML_preparedocument @ih output, @p

INSERT Employee
SELECT *
FROM OPENXML(@ih, “data/emp”)
WITH Employee

EXEC sp_XML_removedocument @ih


Наступний крок має змінити вхідні дані на допустимий XML. Просто оголосимо змінну XML і привласнимо їй бажані XML-дані, а потім виконаємо вищенаведену збережену процедуру:


declare @x XML

set @x=”
<emp empid=”1″ name=”John” salary=”10000″ />
<emp empid=”2″ name=”Joseph” salary=”3000″ />
<emp empid=”3″ name=”Melissa” salary=”2500″ />
<emp empid=”4″ name=”Dan” salary=”2000″ />
</data>”
exec usp_ProcessRowset @x
– Тільки для того, щоб упевнитися, що це працює
select * from Employee


Ось результат:


Empid      Name      Salary
1      John        $10000.00
2      Joseph       $3000.00
3      Melissa      $2500.00
4      Dan          $2000.00
(4 row(s) affected)


Ви можете збирати користувальницькі вхідні дані у файлі XML, і згодом передавати його в збережену процедуру. При використанні цієї техніки Ви мінімізуєте виклики процедури, підвищуючи продуктивність.


Витяг значень зі списку, розділеного комами (CSV)


Кілька разів на форумах я бачив повідомлення від нових розробників SQL, які запитували, як вони можуть передати масив в процедуру. На мій погляд, єдиною відповіддю на те питання є використання списку з комою-роздільником, а проте його зворотне перетворення до набору рядків – це головний біль. Деякі розробники будуть використовувати цикл для витягання значень зі списку. У цій статті я покажу Вам новий спосіб вирішення цієї проблеми.


Рішення циклом:


Отже, почнемо. Нехай є наступна таблиця:


create proc usp_LoopVersion @CSV varchar(max)
AS

SET NOCOUNT ON
declare @res table (val varchar(100))
declare @pos int
set @pos=CHARINDEX(“,”,@CSV,1)

while @pos > 0
begin
     insert @res
     values(ltrim(substring(@CSV,1,@pos-1)))
     set @CSV=right(@CSV,len(@CSV)-@pos)
     set @pos=CHARINDEX(“,”,@CSV,1)
end

insert @res
values(ltrim(@CSV))

select *
     from @res


Тут просто визначається положення першої коми, потім витягується перше значення списку (від початку списку до позиції знайденої коми) і додається до табличної змінну @ res; після чого доданий значення віддаляється зі списку. Цей алгоритм повторюється в циклі до тих пір, поки в списку виявляється кома.


Рішення XML:


CREATE PROC usp_LoopVersion @CSV VARCHAR(MAX)
AS
SET NOCOUNT ON
DECLARE @idoc INT
– Розділ A
SET @CSV =”<root><x val=””+replace(@CSV,”,”,”” /><x val=””)+”” /></root>”

EXEC sp_XML_preparedocument @idoc OUTPUT, @CSV

SELECT *
FROM OPENXML (@idoc, “/root/x”,1)
         WITH (val VARCHAR (100) )

EXEC sp_XML_removedocument idoc


Я замінив коми на “/>

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Метки: , , , , , ,
Рубрики: Різне

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*