Удаление недопустимых символов в XML при извлечении данных из базы данных SQL Server - PullRequest
1 голос
/ 11 июня 2019

Я столкнулся с подобной проблемой (см. Сообщение об ошибке ниже). Я ищу хранимые процедуры для конкретного слова в базе данных SQL Server. Наборы результатов извлечения: objectName, ObjectType и ObjectText (в которых существует искомое слово). Я пытаюсь вывести ObjectText в виде XML-формы, чтобы ее можно было щелкнуть, чтобы открыть непосредственно из наборов результатов. Он отлично работает с триггерами, но не с хранимыми процедурами, поскольку при преобразовании в форму XML кажется, что он сталкивается с недопустимыми символами.

Я испробовал несколько предложений, предложенных в сети, таких как приведение / преобразование / замена унифицированных символов, XML, ascii и т. Д., И замена недопустимых символов, таких как &#xD, &#xA, &#x9, но безуспешно.

SELECT 
    o.name as 'ObjectName', 
    CASE o.xtype 
       WHEN 'C' THEN 'CHECK constraint ' 
       WHEN 'D' THEN 'Default or DEFAULT constraint'
       WHEN 'F' THEN 'FOREIGN KEY constraint'
       WHEN 'FN' THEN 'Scalar function'
       WHEN 'IF' THEN 'In-lined table-function'
       WHEN 'K' THEN 'PRIMARY KEY or UNIQUE constraint'
       WHEN 'L' THEN 'Log'
       WHEN 'P' THEN 'Stored procedure'
       WHEN 'R' THEN 'Rule'
       WHEN 'RF' THEN 'Replication filter stored procedure' 
       WHEN 'S' THEN 'System table'  
       WHEN 'TF' THEN 'Table function' 
       WHEN 'TR' THEN 'Trigger'  
       WHEN 'U' THEN 'User table' 
       WHEN 'V' THEN 'View' 
       WHEN 'X' THEN 'Extended stored procedure' 
       ELSE o.xtype 
    END as 'ObjectType',
    CAST(c.text as XML) as 'SearchObject'
FROM 
    syscomments c
INNER JOIN 
    sysobjects o ON c.id = o.id
LEFT JOIN 
    sysobjects p ON o.Parent_obj = p.id
WHERE 
    o.xtype = 'P'
    AND (c.text LIKE '%loan_timestamp%' OR 
         c.text LIKE '%aclk_timestamp%' OR
         c.text LIKE '%addr_timestamp%')

Ошибка:

Сообщение 9455, Уровень 16, Состояние 1, Строка 121
Синтаксический анализ XML: строка 44, символ 28, недопустимый квалифицированный символ имени

CAST(c.text as XML) AS 'SearchObject' 

В этом столбце должен быть кликабельный XML, поэтому хранимые процедуры / триггеры можно открывать непосредственно из наборов результатов.

1 Ответ

1 голос
/ 11 июня 2019

Если я правильно понял, вы не показываете нам, что может содержать ваша колонка c.text, но вы показываете довольно большой запрос, который не имеет ничего общего с вашей проблемой ...

Если я правильно понял, вы хотите включить c.text в свой набор результатов в виде интерактивного XML. хотя это не очень хорошо отформатированный, действительный XML (или, по крайней мере, не во всех случаях).

Два подхода:

  • Попробуйте TRY_CAST вместо CAST, чтобы вернуть NULL, если приведение не в порядке
  • Используйте подзапрос, такой как
    (SELECT c.text AS [*] FOR XML PATH(''),TYPE) AS SearchObject

Первый не выдаст ошибку, но не сделает вас счастливыми. Любое вхождение &, < или > (и многих других запрещенных символов) заставит его отображаться с NULL ...

Второй получит содержимое столбцов и неявно выполнит все экранирование для вашего ... Помните, что в средстве просмотра XML вы увидите экранированные последовательности вместо запрещенных символов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...