Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 select for xml explicit. How to get result  [new]
Sergey Groshev
Member

Откуда: N. Novgorod
Сообщений: 40
Всем доброго времени суток !!!

Вообщем столкнулся с такой проблемой.. в хранимке генерю XML все правильно работает, из QA результат виден и валидный, Но....

1. Если брать в QA результат в виде текста то он выдается одной строкой,если в виде грида то получается что он разбит на строки. Вопрос какого так получается ведь XML как минимум должен быть единой строкой (тип ntext или что-то подобное)?

2. Ладно первый вопрос он более теоретически а вот второе очень интересует
Пытаюсь на VB (прошу не кидаться :-) не я выбирал) из Recordseta выдрать XML в виде текста получается каша. Сразу вопрос какого типа возвращается Recordset и как из него получить текст XML ?
4 окт 05, 08:49    [1934626]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
FAQ
4 окт 05, 08:52    [1934633]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
Sergey Groshev
Member

Откуда: N. Novgorod
Сообщений: 40
tpg
FAQ


Неа не оно
If cnn.State = 1 Then
    Set rst = cnn.Execute("SELECT * FROM [MYTABLE] FOR XML RAW")
    If rst.State = 1 Then
		strXML = ""
		While Not rst.EOF
    		strXML = strXML & rst.Fields(0).Value
    		rst.MoveNext
    	Wend
		rst.Close
	End If
	cnn.Close
End If
WScript.Echo strXML


Такая конструкция не работает первым символом должен быть знак открывающейся угловой скобки а выдается знак вопроса и т.д
4 окт 05, 09:00    [1934647]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Вы б хоть поиском воспользовались...
4 окт 05, 09:14    [1934681]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
Sergey Groshev
Member

Откуда: N. Novgorod
Сообщений: 40
tpg
Вы б хоть поиском воспользовались...


Спасибо конечно но это снова не то. В проекте жестко регламентирован вызов хранимок вот таким образом
4 окт 05, 09:24    [1934699]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
Sergey Groshev
Member

Откуда: N. Novgorod
Сообщений: 40
tpg
Вы б хоть поиском воспользовались...


Спасибо конечно но это снова не то. В проекте жестко регламентирован вызов хранимок вот таким образом
Public Function usp_Execute(sp_name As String, ParamArray Params()) As Adodb.Recordset
    On Error GoTo CatchErr
    Dim CMD As New Adodb.Command
    Dim X As Adodb.Parameter
    Dim RetVal As Long, err_num As Long
    Dim ErrDesc As String
    Dim i As Byte
100    Set RETURN_VALUES = New Collection

110    CMD.ActiveConnection = RTData
120    CMD.CommandType = adCmdStoredProc
130    CMD.CommandText = sp_name
140    CMD.CommandTimeout = 180
   
150    If UBound(Params) <> -1 Then
160       For i = 0 To UBound(Params) Step 2
170          CMD.Parameters(Params(i)) = Params(i + 1)
          Next
       End If
   
180    Set usp_Execute = CMD.Execute
   
190    For Each X In CMD.Parameters
200       RETURN_VALUES.Add X.Value, X.Name
       Next
   
    Exit Function
CatchErr:
        ErrDesc = err.Description
210     Call PrintLog("Error. usp_Execute. " & ErrDesc & " Erl:" & Erl)
215     Call err.Raise(101, "usp_Execute", ErrDesc)
220     Set usp_Execute = Nothing
230     Set RETURN_VALUES = Nothing
End Function

а из этого с потоком не проходит
4 окт 05, 09:25    [1934705]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Что вы пытаетесь сделать?
4 окт 05, 09:29    [1934721]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
Sergey Groshev
Member

Откуда: N. Novgorod
Сообщений: 40
tpg
Что вы пытаетесь сделать?

Вызываю с помощью это функции хранимку которая возвращает XML
recorset ессно содержит один столбец содержащий XML

Dim rs As Adodb.Recordset
Dim ole As New Adodb.Stream
Dim Xml_Data As New MSXML2.DOMDocument

 ole.Type = adTypeText
 Call ole.Open
 Set rs = usp_Execute("usp_GetUserTasks")
 ole.WriteText (rs(0))
 ole.Position = 0
 Xml_Data.loadXML ole.ReadText
В итоге в MSXML вижу ошибку парсинга
"?Type_ID?Type_Caption?Proj_id?CR_identifier?CR_ID?Severity?Priority?DescriptionShort?Submitter?NewCRIdentifier?SetupTime?ExecTime?DebugTime?Result_ID?ResultName?MarkColorResult?Co"
Где лажа не пойму
4 окт 05, 09:39    [1934750]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ладно, разберемся по порядку..
Sergey Groshev
...в хранимке генерю XML все правильно работает, из QA результат виден и валидный, Но....

1. Если брать в QA результат в виде текста то он выдается одной строкой,если в виде грида то получается что он разбит на строки. Вопрос какого так получается ведь XML как минимум должен быть единой строкой (тип ntext или что-то подобное)?
Да, именно, XML можно рассматривать как единую строку (поток символов).
А то, что QA умеет показать текст XML документа в виде таблицы, так это - способности самого QA и не более.
Sergey Groshev
2. Ладно первый вопрос он более теоретически а вот второе очень интересует
Пытаюсь на VB (прошу не кидаться :-) не я выбирал) из Recordseta выдрать XML в виде текста получается каша. Сразу вопрос какого типа возвращается Recordset и как из него получить текст XML ?
С чего вы решили, что запрос FOR XML возвращает рекордсет?
BOL так и говорит: You can execute SQL queries against existing relational databases to return results as XML documents rather than as standard rowsets. To retrieve results directly, use the FOR XML clause of the SELECT statement...

Теперь по сути того что вы хотите сделать (или вас заставляют). Для того чтобы вернуть функцией рекордсет можно попробовать сделать "пустой" рекордсет каким-нибудь "пустым" запросом типа
SELECT top 0 cast(NULL as nvarchar(4000))
,
залить из хранимой процедуры XML документ в объект класса ADODB.Stream, а потом рубить его на строки по 4000 символов и добавлять их в свой рекордсет...

А вот, если же вам все же нужен файл в виде XML документа, тогда - читайте ссылку.
4 окт 05, 09:52    [1934805]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
Sergey Groshev
Member

Откуда: N. Novgorod
Сообщений: 40
tpg
Ладно, разберемся по порядку..
Да, именно, XML можно рассматривать как единую строку (поток символов).
А то, что QA умеет показать текст XML документа в виде таблицы, так это - способности самого QA и не более.

Это то понятно
tpg

С чего вы решили, что запрос FOR XML возвращает рекордсет?
BOL так и говорит: You can execute SQL queries against existing relational databases to return results as XML documents rather than as standard rowsets. To retrieve results directly, use the FOR XML clause of the SELECT statement...

Ну вот приехали ... с помощью вышеприведенной функции я получаю ADODB.Recordset. А что иначе кроме рекордсета и возвращаемых пременных может вернуть хранимка ? или я не догоняю %-)
tpg

Теперь по сути того что вы хотите сделать (или вас заставляют). Для того чтобы вернуть функцией рекордсет можно попробовать сделать "пустой" рекордсет каким-нибудь "пустым" запросом типа
SELECT top 0 cast(NULL as nvarchar(4000))
,
залить из хранимой процедуры XML документ в объект класса ADODB.Stream, а потом рубить его на строки по 4000 символов и добавлять их в свой рекордсет...

А вот, если же вам все же нужен файл в виде XML документа, тогда - читайте ссылку.

А зачем еще левый рекорсет то забабахивать ...
Так вот и фишка то в том что файл мне не нужен мне нужно передать парсеру XML который вернула хранимка, а если я это делаю вышеобозначенным способом то XML савсем не тот как выглядит он в QA .. Где грабли я не пойму ... Бьюсь уже 4 дня ... а к завтрему надо чтоб заработало :-)
4 окт 05, 10:05    [1934863]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Sergey Groshev
tpg
С чего вы решили, что запрос FOR XML возвращает рекордсет?
BOL так и говорит: You can execute SQL queries against existing relational databases to return results as XML documents rather than as standard rowsets. To retrieve results directly, use the FOR XML clause of the SELECT statement...

Ну вот приехали ... с помощью вышеприведенной функции я получаю ADODB.Recordset. А что иначе кроме рекордсета и возвращаемых пременных может вернуть хранимка ? или я не догоняю %-)
Вот именно - не догоняете... Ещё раз - внимательно посмотрите ссылку...

Sergey Groshev
А зачем еще левый рекорсет то забабахивать ...
Так вот и фишка то в том что файл мне не нужен мне нужно передать парсеру XML который вернула хранимка, а если я это делаю вышеобозначенным способом то XML савсем не тот как выглядит он в QA .. Где грабли я не пойму ... Бьюсь уже 4 дня ... а к завтрему надо чтоб заработало :-)

Вытащите XML в поток и, вот его то, лейте в парсер.
4 окт 05, 10:11    [1934891]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
Sergey Groshev
Member

Откуда: N. Novgorod
Сообщений: 40
tpg

Вытащите XML в поток и, вот его то, лейте в парсер.


так вот с этим то и проблема
Dim rs As Adodb.Recordset
Dim ole As New Adodb.Stream
Dim Xml_Data As New MSXML2.DOMDocument

 ole.Type = adTypeText
 Call ole.Open
 Set rs = usp_Execute("usp_GetUserTasks")
 ole.WriteText (rs(0))
 ole.Position = 0
 Xml_Data.loadXML ole.ReadText

после выполнения этого в парсере идет ошибка парсинга из-за того что xml попадает туда в виде
?Type_ID?Type_Caption?Proj_id?CR_identifier?CR_ID?Severity?Priority? и т.д.
а надо чтоб
<Type Type_ID="2" Type_Caption="CR Validation"><Project Proj_id="181
Вот в этом и проблема ...
4 окт 05, 10:19    [1934941]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
Glory
Member

Откуда:
Сообщений: 104760
Sergey Groshev
после выполнения этого в парсере идет ошибка парсинга из-за того что xml попадает туда в виде
?Type_ID?Type_Caption?Proj_id?CR_identifier?CR_ID?Severity?Priority? и т.д.
а надо чтоб
<Type Type_ID="2" Type_Caption="CR Validation"><Project Proj_id="181
Вот в этом и проблема ...

Пример из FAQ в том виде, как он есть, без ваших вариаций вроде Stream и DOMDocument работает ?
4 окт 05, 10:22    [1934961]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
Sergey Groshev
Member

Откуда: N. Novgorod
Сообщений: 40
Glory

Пример из FAQ в том виде, как он есть, без ваших вариаций вроде Stream и DOMDocument работает ?

Может я тупею но какой конкретно ?
4 окт 05, 10:28    [1934997]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
Glory
Member

Откуда:
Сообщений: 104760
Sergey Groshev
Glory

Пример из FAQ в том виде, как он есть, без ваших вариаций вроде Stream и DOMDocument работает ?

Может я тупею но какой конкретно ?

На VBScript-е который
4 окт 05, 10:36    [1935048]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
Sergey Groshev
Member

Откуда: N. Novgorod
Сообщений: 40
Glory

На VBScript-е который

да он работает но если я меняю соннекшон стринг на
"Provider=SQLOLEDB.1;Password=pass;Persist Security Info=True;User ID=user;Initial Catalog=dev;Data Source=sqlserver"

то нет
А сделано именно так
4 окт 05, 10:49    [1935106]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
Sergey Groshev
Member

Откуда: N. Novgorod
Сообщений: 40
Sergey Groshev
Glory

На VBScript-е который

да он работает но если я меняю соннекшон стринг на
"Provider=SQLOLEDB.1;Password=pass;Persist Security Info=True;User ID=user;Initial Catalog=dev;Data Source=sqlserver"

то нет
А сделано именно так


И тишина ... может кто-нить поможет ?
4 окт 05, 12:41    [1935602]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну, дык-ть... вы разницу в строке коннекта чувствуете? в FAQ-е дается строка для ODBC дров, а вы пробуете повторить с OLE DB провайдером...
4 окт 05, 12:45    [1935630]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
Sergey Groshev
Member

Откуда: N. Novgorod
Сообщений: 40
tpg
Ну, дык-ть... вы разницу в строке коннекта чувствуете? в FAQ-е дается строка для ODBC дров, а вы пробуете повторить с OLE DB провайдером...

Ессно проверил и не пашет
4 окт 05, 13:31    [1935919]     Ответить | Цитировать Сообщить модератору
 Re: select for xml explicit. How to get result  [new]
Sergey Groshev
Member

Откуда: N. Novgorod
Сообщений: 40
Sergey Groshev
tpg
Ну, дык-ть... вы разницу в строке коннекта чувствуете? в FAQ-е дается строка для ODBC дров, а вы пробуете повторить с OLE DB провайдером...

Ессно проверил и не пашет


Все работает ... Тема закрыта
4 окт 05, 18:03    [1937591]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить