2012-06-19 3 views
2

Я пытаюсь извлечь значения из столбца XML. К сожалению, какую бы комбинацию я ни старался, я не могу получить никакого значимого результата.Обработка ProcessParameters как XML в SQL Server

Тестовый скрипт с данными можно найти here

Связанные вопросы, которые не включить свет для меня

Пример содержимого одного элемента

<Dictionary xmlns="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:mtbwa="clr-namespace:Microsoft.TeamFoundation.Build.Workflow.Activities;assembly=Microsoft.TeamFoundation.Build.Workflow" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:TypeArguments="x:String, x:Object"> 
    <mtbwa:BuildSettings x:Key="BuildSettings" ProjectsToBuild="$/Projects/BpABA/Dev/V6/DUnit/FrameworkTests.dproj"> 
    <mtbwa:BuildSettings.PlatformConfigurations> 
     <mtbwa:PlatformConfigurationList Capacity="1"> 
     <mtbwa:PlatformConfiguration Configuration="Debug" Platform="Win32" /> 
     </mtbwa:PlatformConfigurationList> 
    </mtbwa:BuildSettings.PlatformConfigurations> 
    </mtbwa:BuildSettings> 
    <mtbwa:SourceAndSymbolServerSettings SymbolStorePath="{x:Null}" x:Key="SourceAndSymbolServerSettings" /> 
    <mtbwa:AgentSettings x:Key="AgentSettings" MaxExecutionTime="01:00:00" MaxWaitTime="04:00:00" Tags="Delphi 5" /> 
    <x:Boolean x:Key="CreateWorkItem">False</x:Boolean> 
    <x:Boolean x:Key="PerformTestImpactAnalysis">False</x:Boolean> 
</Dictionary> 

Последняя попытка

;WITH XMLNAMESPACES('http://schemas.microsoft.com/winfx/2006/xaml' AS mtbwa) 
, q AS (
    SELECT CAST(bd.ProcessParameters AS XML) p 
    FROM dbo.tbl_BuildDefinition bd  
) 
SELECT X.Doc.value('mtbwa:BuildSettings[0]', 'VARCHAR(50)') AS 'Test' 
FROM q CROSS APPLY p.nodes('/mtbwa:Dictionary') AS X(Doc) 

фон

колонна ProcessParameters является частью TFS системы построения в tbl_BuildDefinition таблице , Полный DDL выглядит следующим образом

USE [Tfs_ProjectCollection] 
GO 

/****** Object: Table [dbo].[tbl_BuildDefinition] Script Date: 06/19/2012 16:28:56 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[tbl_BuildDefinition](
    [DefinitionId] [int] IDENTITY(1,1) NOT NULL, 
    [GroupId] [int] NOT NULL, 
    [DefinitionName] [nvarchar](260) NOT NULL, 
    [ControllerId] [int] NOT NULL, 
    [DropLocation] [nvarchar](260) NULL, 
    [ContinuousIntegrationType] [tinyint] NOT NULL, 
    [ContinuousIntegrationQuietPeriod] [int] NOT NULL, 
    [LastBuildUri] [nvarchar](64) NULL, 
    [LastGoodBuildUri] [nvarchar](64) NULL, 
    [LastGoodBuildLabel] [nvarchar](326) NULL, 
    [Enabled] [bit] NOT NULL, 
    [Description] [nvarchar](2048) NULL, 
    [LastSystemQueueId] [int] NULL, 
    [LastSystemBuildStartTime] [datetime] NULL, 
    [ProcessTemplateId] [int] NOT NULL, 
    [ProcessParameters] [nvarchar](max) NULL, 
    [ScheduleJobId] [uniqueidentifier] NOT NULL, 
CONSTRAINT [PK_tbl_BuildDefinition] PRIMARY KEY CLUSTERED 
(
    [GroupId] ASC, 
    [DefinitionName] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[tbl_BuildDefinition] ADD DEFAULT (newid()) FOR [ScheduleJobId] 
GO 
+1

Вы, безусловно, не являетесь, по крайней мере, не тем, что я видел до сих пор на вашем сайте :-) :-) :-) –

ответ

1

Я думаю, что у вас есть неправильное пространство имен, определенные для вашего mbtwa префикса в тексте XML/XQuery, и вам нужно использовать индексацию 1 на основе получить на данных при использовании .value() функция (не используется на основе 0, как обычно используется).

Так попробуйте это:

;WITH XMLNAMESPACES('clr-namespace:Microsoft.TeamFoundation.Build.Workflow.Activities;assembly=Microsoft.TeamFoundation.Build.Workflow' AS mtbwa, 
        DEFAULT 'clr-namespace:System.Collections.Generic;assembly=mscorlib') 
, q AS (
    SELECT CAST(bd.ProcessParameters AS XML) p 
    FROM dbo.tbl_BuildDefinition bd  
    WHERE DefinitionId = 1 
) 
SELECT 
    X.Doc.query('mtbwa:BuildSettings') AS 'Node', 
    X.Doc.value('(mtbwa:BuildSettings/@ProjectsToBuild)[1]', 'VARCHAR(50)') AS 'ProjectsToBuild' 
FROM 
    q 
CROSS APPLY 
    p.nodes('/Dictionary') AS X(Doc) 

Это должно дать вам весь <mtbwa:BuildSettings> узел как XML (с помощью функции .query()), а также значение одного атрибута ProjectsToBuild ($/Projects/BpABA/Dev/V6/DUnit/FrameworkTests.dproj) этого узла.

enter image description here

Если вы хотите весь узел (как XML), то вам нужно использовать .query('xpath') - функция .value() вы можете получить внутренний текст узла (если таковой имеется), или стоимость одного атрибут.

Это вообще помогает?

+0

Я изменил ваше заявление, чтобы оно вписывалось в мой фактический запрос, но это не возвращая никаких результатов. Если вы пропустили это в моем вопросе, я установил тестовый стенд [здесь] (http://data.stackexchange.com/stackoverflow/revision/73408/81549/processing-processparameters-as-xml-in-sql- сервер), где я включил ваше заявление. –

+0

Хорошо, что делать, если вы занимаетесь только XML (оставьте свой другой стол)? Это возвращает значения? Это для меня .... –

+0

Вы должны уметь копировать/вставлять весь оператор и запускать его ?! –