Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 xml node по русски (xml.modify)  [new]
d.Oleg
Member

Откуда:
Сообщений: 22
Прошу помощи с синтаксисом - node по русски
При выполнении ругается в Manager
XQuery [modify()]: Syntax error near '?', expected a step expression.

BEGIN
SET @xml.modify('replace value of (/*/@Тип)[1] with sql:variable("@DocTypeName")');--не нравится так
SET @xml.modify('replace value of (/*/@Type)[1] with sql:variable("@DocTypeName")');--так работает
END

IF @PagesCount IS NOT NULL
BEGIN
SET @xml.modify('replace value of (/*/@КолСтр)[1] with sql:variable("@PagesCount")');
END

Заранее благодарен
3 авг 17, 14:54    [20698075]     Ответить | Цитировать Сообщить модератору
 Re: xml node по русски (xml.modify)  [new]
d.Oleg
Member

Откуда:
Сообщений: 22
дополню всей процедурой
alter PROCEDURE [dbo].[add_component] @PId BIGINT
	,@DocTypeId INT
	,@InNumber VARCHAR(50)
	,@PagesCount INT
	,@StageId INT
	,@UserId INT
AS
BEGIN
	DECLARE @xml XML
	DECLARE @DocTypeName NVARCHAR(MAX)
	DECLARE @seq INT
	DECLARE @Priority INT
	DECLARE @RegNumber VARCHAR(50)

	SELECT TOP 1 @xml = XmlNode
		,@DocTypeName = d.NAME
		,@Priority = d.Priority
	FROM tblDocTypes d
	LEFT JOIN tblXmlTemplates x ON x.Id = d.XmlTemplateId
	WHERE d.Id = @DocTypeId

	SELECT @seq = MAX(d.SeqNumber)
	FROM tblDocuments d
		,recurce_documents(@PId) rec
	WHERE d.Id = rec.id

	IF @seq IS NULL
	BEGIN
		SET @seq = 1;
	END
	ELSE
	BEGIN
		SET @seq = @seq + 1;
	END

	SELECT @RegNumber = regdocnumber
	FROM tbldocuments
	WHERE id = @PId

	INSERT INTO tblDocuments (
		PId
		,InDocNumber
		,RegDocNumber
		,XmlNode
		,CreateDate
		,LastUpdateDate
		,DocTypeId
		,StageId
		,UpdaterId
		,SeqNumber
		,Priority
		)
	VALUES (
		@PId
		,@InNumber
		,@RegNumber
		,@xml
		,GETDATE()
		,GETDATE()
		,@DocTypeId
		,@StageId
		,@UserId
		,@seq
		,@Priority
		)

	DECLARE @ID BIGINT

	SET @ID = @@IDENTITY

	IF @ID IS NOT NULL
	BEGIN
		SET @xml.modify('replace value of (/*/@ID)[1] with sql:variable("@ID")');
	END

	IF @DocTypeName IS NOT NULL
	BEGIN
		SET @xml.modify('replace value of (/*/@Тип)[1] with sql:variable("@DocTypeName")'); -- Ругается
	END

	IF @PagesCount IS NOT NULL
	BEGIN
		SET @xml.modify('replace value of (/*/@КолСтр)[1] with sql:variable("@PagesCount")');-- Ругается
	END

	IF @InNumber IS NOT NULL
	BEGIN
		SET @xml.modify('replace value of (/*/@ВхНом)[1] with sql:variable("@InNumber")');-- Ругается
	END

	UPDATE tblDocuments
	SET XmlNode = @xml
	WHERE Id = @ID
END

SELECT @ID;
3 авг 17, 15:20    [20698210]     Ответить | Цитировать Сообщить модератору
 Re: xml node по русски (xml.modify)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31357
d.Oleg
Прошу помощи с синтаксисом - node по русски
При выполнении ругается в Manager
XQuery [modify()]: Syntax error near '?', expected a step expression.
В юникоде пишите, иначе все буквы преобразуются в ?, отсюда и текст ошибки.
3 авг 17, 15:31    [20698280]     Ответить | Цитировать Сообщить модератору
 Re: xml node по русски (xml.modify)  [new]
d.Oleg
Member

Откуда:
Сообщений: 22
d.Oleg,

разобрался, проблема была в collation БД.
Перекинул на cyrillic_general и процедура отработала. Все спасибо.
3 авг 17, 16:07    [20698465]     Ответить | Цитировать Сообщить модератору
 Re: xml node по русски (xml.modify)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31357
d.Oleg
d.Oleg,

разобрался, проблема была в collation БД.
Перекинул на cyrillic_general и процедура отработала. Все спасибо.
Нужно было всё таки буковку N дописать.
Когда программа падает, если там не тот коллейшен, или какие то не такие натройки сервера - это ненормально, не надо ошибки в коде маскировать шаманством, по принципу "бубном потряс, на моём компе заработало, и хрен с ним".
3 авг 17, 16:27    [20698538]     Ответить | Цитировать Сообщить модератору
 Re: xml node по русски (xml.modify)  [new]
d.Oleg
Member

Откуда:
Сообщений: 22
alexeyvg,

N не помогает :(
3 авг 17, 17:06    [20698674]     Ответить | Цитировать Сообщить модератору
 Re: xml node по русски (xml.modify)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31357
d.Oleg
alexeyvg,

N не помогает :(
Показали бы код.
У меня помогает.
3 авг 17, 17:15    [20698702]     Ответить | Цитировать Сообщить модератору
 Re: xml node по русски (xml.modify)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31357
alexeyvg
d.Oleg
alexeyvg,

N не помогает :(
Показали бы код.
У меня помогает.
Вот мой
declare @DocTypeName nvarchar(1) = 5
declare @xml xml = N'
<root>
	<ID Type="1" Тип="2">asdf</ID>
</root>
'
--не нравится так
--SET @xml.modify('replace value of (/*/@Тип)[1] with sql:variable("@DocTypeName")');
--так работает
SET @xml.modify(N'replace value of (/*/@Тип)[1] with sql:variable("@DocTypeName")');
go
3 авг 17, 17:18    [20698708]     Ответить | Цитировать Сообщить модератору
 Re: xml node по русски (xml.modify)  [new]
d.Oleg
Member

Откуда:
Сообщений: 22
alexeyvg
alexeyvg
пропущено...
Показали бы код.
У меня помогает.
Вот мой
declare @DocTypeName nvarchar(1) = 5
declare @xml xml = N'
<root>
	<ID Type="1" Тип="2">asdf</ID>
</root>
'
--не нравится так
--SET @xml.modify('replace value of (/*/@Тип)[1] with sql:variable("@DocTypeName")');
--так работает
SET @xml.modify(N'replace value of (/*/@Тип)[1] with sql:variable("@DocTypeName")');
go


Спасибо, с N по Вашему коду работает.
4 авг 17, 08:22    [20699496]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить