powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Обсуждение нашего сайта (архив) [закрыт] [закрыт для гостей] / Глори, ты pending FAQ submittions смотришь иногда?
10 сообщений из 10, страница 1 из 1
Глори, ты pending FAQ submittions смотришь иногда?
    #1356046
Фотография Программизд 02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Администратор
Пару месяцев назад мне надо было подготовить демо-примерчик для разработчиком как поместить результат FOR XML в поле TEXT и как пропарсить XML из поля TEXT. На основе твоих ответов сделал готовый работающий примерчик и решил что он может быть полезен в FAQ'е и засабмитил его.
Код
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.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
drop table XML_EXPORT
go

CREATE TABLE XML_EXPORT(
ID int,
XML_DATA text
)
go

drop table emp
go

CREATE TABLE EMP(
ID int,
ENAME varchar(50),
age int
)
go

insert into emp values (1, 'Igor', 23)
insert into emp values (2, 'Oleg', 34)
insert into emp values (3, 'Alex', 28)
insert into emp values (4, 'Sergei', 78)
GO

DROP PROC RaiseError
GO

CREATE PROC [dbo].[RaiseError]
  @object int,
  @hr int,
  @user_description nvarchar(4000)=NULL
AS
DECLARE @errormsg nvarchar(4000),
  @source nvarchar(4000),
  @description nvarchar(4000)

EXEC @hr = sp_OAGetErrorInfo @object, @source OUT, @description OUT
IF @hr = 0
BEGIN
  SET @errormsg = ''
  IF @user_description IS NOT NULL SET @errormsg = @user_description + char(13) + char(10)

  SET @errormsg = @errormsg + N'Source: ' + @source + char(13) + char(10)
  SET @errormsg = @errormsg + N'Description: ' + @description
  RAISERROR(@errormsg, 16, 1)
  RETURN
END
ELSE
BEGIN
  RAISERROR('Detailed error information can not be retrieved', 16, 1)
  RETURN
END

GO

DROP PROC PutXMLtoTEXT
GO

-- ***********************************************
-- PROCEDURE FOR PUTTING XML TO FIELD TEXT
-- ***********************************************
-- it is not possible to put the result of FOR XML to TEXT field
-- the trick is using COM that is the server acts
-- as a COM client of itself to read the data of FOR XML
CREATE PROC [dbo].[PutXMLtoTEXT] @query varchar(4000)
AS
DECLARE @dbname sysname,
        @sqlobject int,
        @object int,
        @hr int,
        @results int

-- create COM object SQLDMO.SQLServer
EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @sqlobject OUT
IF (@hr <> 0)
BEGIN
  EXEC RaiseError @sqlobject, @hr, N'Creating SQLDMO.SQLServer object'
  RETURN
END

EXEC @hr = sp_OASetProperty @sqlobject, 'LoginSecure', 1
IF (@hr <> 0)
BEGIN
  EXEC RaiseError @sqlobject, @hr, N'Switch on trusted connection mode'
  RETURN
END

EXEC @hr = sp_OASetProperty @sqlobject, 'ODBCPrefix', 0
IF (@hr <> 0)
BEGIN
  EXEC RaiseError @sqlobject, @hr, N'Switching off ODBCPrefix'
  RETURN
END

EXEC @hr = sp_OAMethod @sqlobject, 'Connect', NULL, @@SERVERNAME
IF (@hr <> 0)
BEGIN
  EXEC RaiseError @sqlobject, @hr, N'Connecting to SQL Server'
  RETURN
END

EXEC @hr = sp_OAGetProperty @sqlobject, 'Databases', @object OUT
IF (@hr <> 0)
BEGIN
  EXEC RaiseError @sqlobject, @hr, N'Getting Database collection handler'
  RETURN
END

SET @dbname = DB_NAME()
EXEC @hr = sp_OAMethod @object, 'Item', @object OUT, @dbname
IF (@hr <> 0)
BEGIN
  EXEC RaiseError @sqlobject, @hr, N'Getting handler for current database'
  RETURN
END

EXEC @hr = sp_OAMethod @object, 'ExecuteWithResults', @results OUT, @query
IF (@hr <> 0)
BEGIN
  EXEC RaiseError @sqlobject, @hr, N'Executing query ExecuteWithResults'
  RETURN
END

DECLARE @row_count INT
EXEC @hr = sp_OAMethod @results, 'Rows', @row_count OUT
IF @hr <> 0
BEGIN
  EXEC RaiseError @sqlobject, @hr, N'Getting row count'
  RETURN
END

DECLARE @ptrval binary(16)
DECLARE @cur_length INT

SELECT @PTRVAL = TEXTPTR(XML_DATA) FROM XML_EXPORT

DECLARE @row INT
DECLARE @out_text varchar(8000)
DECLARE @rpl_res varchar(8000)

SET @row = 1
WHILE(@row <= @row_count)
BEGIN

  EXEC @hr = sp_OAMethod @results, 'GetColumnString', @out_text OUT, @row, 1
  IF @hr <> 0
  BEGIN
    EXEC RaiseError @sqlobject, @hr, N'Retrieving query data'
    RETURN
  END

  SELECT @cur_length = DATALENGTH(XML_DATA) FROM XML_EXPORT
  SET @rpl_res = REPLACE(@out_text, '><', '>' + char(13) + '<')
  UPDATETEXT XML_EXPORT.XML_DATA @ptrval Null 0 @rpl_res

  SET @row = @row + 1

END

EXEC sp_OADestroy @sqlobject

GO

drop proc ParseXML
GO

-- ***********************************************
-- PROCEDURE FOR PARSING XML FROM FIELD TEXT
-- ***********************************************
-- you can declare a procedure with the paramenter TEXT
-- but you can not assign it a value within the database
-- you can only put it from the client
-- the workaround is to dynamically make a procedure call
-- by concatenating the chunks of varchars and execute it by EXEC
create proc ParseXML @ParseProc as varchar(200) as
declare
  @datalen int,
  @sql varchar(8000),
  @sql1 varchar(8000),
  @sql2 varchar(8000),
  @sql3 varchar(8000),
  @sql4 varchar(8000),
  @sql5 varchar(8000),
  @sql6 varchar(8000),
  @sql7 varchar(8000),
  @cnt int
DECLARE @hDoc int

SELECT @datalen = DATALENGTH (xml_data) / 8000 + 1 FROM xml_export

If @datalen is NULL return

SET @cnt = 1
SET @sql = 'DECLARE' + CHAR(13)
WHILE (@cnt <= @datalen)
BEGIN
SELECT @SQL = @SQL + CASE @cnt WHEN 1 THEN '' ELSE ', ' + CHAR(13) END
              + ' @str' + CONVERT(varchar(10), @cnt) + ' varchar(8000)'
SET @cnt = @cnt + 1
END

SET @sql = @sql + ',' + CHAR( 13) + ' @textptr varbinary(16)' + CHAR(13) +
'SELECT @textptr = TEXTPTR(xml_data) FROM xml_export'

SET @SQL1 = ''
SET @SQL2 = ''
SET @SQL3 = ''
SET @SQL4 = ''
SET @SQL5 = ''
SET @SQL6 = ''
SET @SQL7 = ''
SET @cnt = 1
WHILE (@cnt <= @datalen)
BEGIN
IF LEN(@SQL) < 7900
SELECT @SQL = @SQL + CHAR (13) + 'SELECT @str' + CONVERT
(varchar(10), @cnt) + ' = SUBSTRING (xml_data, ' + CONVERT (varchar(30),
(@cnt-1) * 8000 + 1) + ', 8000) FROM xml_export'
ELSE IF LEN(@SQL1) < 7900
SELECT @SQL1 = @SQL1 + CHAR (13) + 'SELECT @str' + CONVERT
(varchar(10), @cnt) + ' = SUBSTRING (xml_data, ' + CONVERT (varchar(30),
(@cnt-1) * 8000 + 1) + ', 8000) FROM xml_export'
ELSE IF LEN(@SQL2) < 7900
SELECT @SQL2 = @SQL2 + CHAR (13) + 'SELECT @str' + CONVERT
(varchar(10), @cnt) + ' = SUBSTRING (xml_data, ' + CONVERT (varchar(30),
(@cnt-1) * 8000 + 1) + ', 8000) FROM xml_export'
ELSE IF LEN(@SQL3) < 7900
SELECT @SQL3 = @SQL3 + CHAR (13) + 'SELECT @str' + CONVERT
(varchar(10), @cnt) + ' = SUBSTRING (xml_data, ' + CONVERT (varchar(30),
(@cnt-1) * 8000 + 1) + ', 8000) FROM xml_export'
ELSE IF LEN(@SQL4) < 7900
SELECT @SQL4 = @SQL4 + CHAR (13) + 'SELECT @str' + CONVERT
(varchar(10), @cnt) + ' = SUBSTRING (xml_data, ' + CONVERT (varchar(30),
(@cnt-1) * 8000 + 1) + ', 8000) FROM xml_export'
ELSE IF LEN(@SQL5) < 7900
SELECT @SQL5 = @SQL5 + CHAR (13) + 'SELECT @str' + CONVERT
(varchar(10), @cnt) + ' = SUBSTRING (xml_data, ' + CONVERT (varchar(30),
(@cnt-1) * 8000 + 1) + ', 8000) FROM xml_export'
ELSE IF LEN(@SQL6) < 7900
SELECT @SQL6 = @SQL6 + CHAR (13) + 'SELECT @str' + CONVERT
(varchar(10), @cnt) + ' = SUBSTRING (xml_data, ' + CONVERT (varchar(30),
(@cnt-1) * 8000 + 1) + ', 8000) FROM xml_export'
ELSE
SELECT @SQL7 = @SQL7 + CHAR (13) + 'SELECT @str' + CONVERT
(varchar(10), @cnt) + ' = SUBSTRING (xml_data, ' + CONVERT (varchar(30),
(@cnt-1) * 8000 + 1) + ', 8000) FROM xml_export'

SET @cnt = @cnt + 1
END

SET @SQL7 = @SQL7 + CHAR(13) + 'EXEC (''EXEC '+ @ParseProc + ' '''''' + '

SET @cnt = 1
WHILE (@cnt <= @datalen)
BEGIN
SELECT @SQL7 = @SQL7 + CASE @cnt WHEN 1 THEN '' ELSE ' + ' END + '@str' + CONVERT(varchar(10), @cnt)
SET @cnt = @cnt + 1
END
SET @SQL7 = @SQL7 + ' + '''''''')'

/*Print @SQL
Print @SQL1
Print @SQL2
Print @SQL3
Print @SQL4
Print @SQL5
Print @SQL6
Print @SQL7*/
EXEC(@SQL+@SQL1+@SQL2+@SQL3+@SQL4+@SQL5+@SQL6+@SQL7)
GO

-- now the example of putting the XML data to the TEXT field
insert into XML_EXPORT (XML_DATA) values (NULL);
update XML_EXPORT set XML_DATA = '<?xml version="1.0" encoding="windows-1252"?>'+char(13)+'<root>'+char(13)
exec PutXMLtoTEXT 'select id, ename, age from emp for xml auto, elements'
DECLARE @ptrval binary(16)
SELECT @PTRVAL = TEXTPTR(XML_DATA) FROM XML_EXPORT
UPDATETEXT XML_EXPORT.XML_DATA @ptrval NULL 0 '</root>'
go

-- viewing the results
select XML_DATA from XML_EXPORT
go

-- now parse the XML data placed in TEXT field
drop proc ParseEMP
go

create proc [dbo].[ParseEMP] @txt text as
DECLARE @hDoc int

 EXEC sp_xml_preparedocument @hDoc OUTPUT, @txt

 -----------------------------------------------------------------
 SELECT id, ename, age
 FROM OPENXML(@hDoc, N'/root/emp')
 with (id int 'id', ename varchar(30) 'ename', age int 'age')
 -----------------------------------------------------------------

 EXEC sp_xml_removedocument @hDoc

GO

exec ParseXML 'ParseEMP'
...
Рейтинг: 0 / 0
Глори, ты pending FAQ submittions смотришь иногда?
    #1356290
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрю Программизд 02, смотрю.
Но ведь его еще и проверять надо всесторонне.
Не волнуйся - выложу твои скрипты
...
Рейтинг: 0 / 0
Глори, ты pending FAQ submittions смотришь иногда?
    #1356354
Фотография Программизд 02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Администратор
Glory 
Смотрю Программизд 02, смотрю.
Но ведь его еще и проверять надо всесторонне.
Не волнуйся - выложу твои скрипты
Copy/Paste В QA и запустить, он самодостаточен. А идеи все равно твои, я раньше даже не думал, что такое возможно. Пусть не совсем красиво, но работает, все довольны.
...
Рейтинг: 0 / 0
Глори, ты pending FAQ submittions смотришь иногда?
    #1368719
Фотография kkv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А о чем вообще речь? Извините, если не в кассу вмешался. :)))

С уважением, kkv
Программизд_02_что_то_не_то.jpg
...
Рейтинг: 0 / 0
Глори, ты pending FAQ submittions смотришь иногда?
    #1368720
Фотография kkv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программизд 02, не обращай внимания - это я просто тупо скопипастил твой SQL-скрипт и также тупо запустил его, не задумываясь о каких-то глубоких материях. Ты должен меня понять - праздники все-таки, а поговорить не с кем, все предательски уснули. Хотя, на мой взгляд, можно было бы и снабдить твой скрипт проверкой на существование объектов, ну, что-то типа: if exists (select * from sysobjects where xtype = 'U' and name = 'XML_EXPORT')
drop table ParseEMP... Ну, или что-нить в подобном роде. Извини, если что не так.

С уважением, kkv
...
Рейтинг: 0 / 0
Глори, ты pending FAQ submittions смотришь иногда?
    #1368784
Фотография Программизд 02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Администратор
to kkv

Ты слишком многого требует от ленивого Окупизда:)

Глори выложил в FAQ переработанные вариант.

//https://www.sql.ru/faq/faq_topic.aspx?fid=398

там должно быть все ОК.
...
Рейтинг: 0 / 0
Глори, ты pending FAQ submittions смотришь иногда?
    #1368841
Фотография kkv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, посмотрел, действительно супер. Осталось только прочитать повнимательнее. :)))

С уважением, kkv
...
Рейтинг: 0 / 0
Глори, ты pending FAQ submittions смотришь иногда?
    #1369066
Фотография Программизд 02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Администратор
Глори, я засабмитил в FAQ еще один пример, для настройки full-text search. Когда пришлось настраивать первый раз такого FAQ'a очень не хватало.

Preview в FAQ'e немножко глючит, так что опубликовал его еще и здесь

FAQ test
...
Рейтинг: 0 / 0
Глори, ты pending FAQ submittions смотришь иногда?
    #1369537
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программизд 02 
Глори, я засабмитил в FAQ еще один пример, для настройки full-text search. Когда пришлось настраивать первый раз такого FAQ'a очень не хватало.
Просто здорово. Спасибо.
...
Рейтинг: 0 / 0
Глори, ты pending FAQ submittions смотришь иногда?
    #1369541
Диченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даешь программизда в модераторы раздела ФАК!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Обсуждение нашего сайта (архив) [закрыт] [закрыт для гостей] / Глори, ты pending FAQ submittions смотришь иногда?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]