-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproc2.sql
108 lines (79 loc) · 2.43 KB
/
proc2.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
CREATE PROCEDURE dbo.contact_crud
(
@site_id int,
@contact_data xml
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @operation_type smallint;
SELECT @operation_type = t.s.value('.', 'smallint')
FROM @contact_data.nodes('/Contact/ID') AS t(s);
-- update contact
IF @operation_type > 0
BEGIN
WITH cte AS
(
SELECT
t.s.value('@id', 'int') AS id,
t.s.value('@first_name', 'nvarchar(100)') AS first_name,
t.s.value('@last_name', 'nvarchar(100)') AS last_name
FROM @contact_data.nodes('/Contact') AS t(s)
)
UPDATE dbo.contact
SET first_name = cte.first_name,
last_name = cte.last_name
FROM dbo.contact AS c
INNER JOIN cte
ON cte.id = c.id
END
-- add new contact
ELSE IF @operation_type = 0
BEGIN
INSERT dbo.contact (site_id, first_name, last_name)
SELECT
@site_id,
t.s.value('@first_name', 'nvarchar(100)'),
t.s.value('@last_name', 'nvarchar(100)')
FROM @contact_data.nodes('/Contact') AS t(s);
END
-- delete contact
ELSE IF @operation_type < 0
BEGIN
DELETE
FROM dbo.contact
WHERE id = (
SELECT
t.s.value('@id', 'nvarchar(100)')
FROM @contact_data.nodes('/Contact') AS t(s)
);
END
-- return site info
EXEC dbo.get_site_info @site_id = @site_id;
END
GO
-----------------------------
-- SOME TESTS
-----------------------------
/*
DECLARE @p xml;
SELECT 'before', * FROM dbo.contact;
-- add new contact
SET @p = N'<Contact id="7" first_name="contact #7 fisrtname" last_name="contact #7 lastname"><ID>0</ID></Contact>';
EXEC dbo.contact_crud
@site_id = 1,
@contact_data = @p;
SELECT 'inserted', * FROM dbo.contact;
-- update contact
SET @p = N'<Contact id="7" first_name="CONTACT #7 FISRTNAME" last_name="CONTACT #7 LASTNAME"><ID>1</ID></Contact>';
EXEC dbo.contact_crud
@site_id = 1,
@contact_data = @p;
SELECT 'updated', * FROM dbo.contact;
-- delete contact
SET @p = N'<Contact id="7" first_name="CONTACT #7 FISRTNAME" last_name="CONTACT #7 LASTNAME"><ID>-1</ID></Contact>';
EXEC dbo.contact_crud
@site_id = 1,
@contact_data = @p;
SELECT 'deleted', * FROM dbo.contact;
--*/