Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在sql中从ntext(xml格式)列中获取值_Sql_Sql Server_Xml_Tsql_Type Conversion - Fatal编程技术网

如何在sql中从ntext(xml格式)列中获取值

如何在sql中从ntext(xml格式)列中获取值,sql,sql-server,xml,tsql,type-conversion,Sql,Sql Server,Xml,Tsql,Type Conversion,我的SQL数据库中有一列名为Triggers\u xml\u data,其类型为ntext。该列是xml格式的,我试图从xml的某个部分获取一个值。我看到一个例子,没有这样的专栏: declare @fileContent xml set @fileContent ='<my:Header> <my:Requestor>Mehrlein, Roswitha</my:Requestor> <my:RequestorUserName>SJM\Mehrl

我的SQL数据库中有一列名为Triggers\u xml\u data,其类型为ntext。该列是xml格式的,我试图从xml的某个部分获取一个值。我看到一个例子,没有这样的专栏:

declare @fileContent xml
set @fileContent ='<my:Header>
<my:Requestor>Mehrlein, Roswitha</my:Requestor>
<my:RequestorUserName>SJM\MehrlR01</my:RequestorUserName>
<my:RequestorEmail>RMehrlein@SJM.com</my:RequestorEmail>   
<my:HRContact>Roswita  Mehrlein, Beatrice Porta</my:HRContact>
<my:Entity>SJM Germany</my:Entity>
<my:Department>HR/Administration</my:Department>
<my:PositionTitle>Sales Representative</my:PositionTitle>     
<my:JobDescription>x0lGQRQAAAABAAAAAAAAAAAeAQAyAAAAVgBAAAAA=</my:JobDescription>
<my:PositionDepartment>Sales</my:PositionDepartment>'
 
;WITH XMLNAMESPACES ('http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-08-29T12-58-51' as my)
select @fileContent.value('(//my:PositionDepartment)[1]', 'varchar(255)')
Declare @filevalue xml

select de.triggers_xml_data
from dbo.DEPLOYMENT_ENVIRONMENT as de
但这不起作用,我尝试使用@filecontent.value“//value[1]”、“varchar255”并使其等于列值,我尝试了强制转换它,但找不到方法。这可能吗

当我这样做时:

SELECT 
CAST(
    REPLACE(CAST(de.TRIGGERS_XML_DATA AS VARCHAR(MAX)), 'encoding="utf-16"', '')
  AS XML).value('(triggers/triggerDefinition/config/item/value)[1]', 'NVARCHAR(max)') as Item, de.ENVIRONMENT_ID
from dbo.DEPLOYMENT_ENVIRONMENT as de
where de.ENVIRONMENT_ID = 19234819
我得到一个返回的空值

下面是我的xml的示例:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configuration xml:space="preserve">

<triggers>
    <defined>true</defined>
    <triggerDefinition>
      <id>1</id>
      <name>After successful deployment</name>
      <userDescription/>
      <isEnabled>true</isEnabled>
      <pluginKey>com.atlassian.bamboo.triggers.atlassian-bamboo-triggers:afterSuccessfulDeployment</pluginKey>
      <triggeringRepositories/>
      <config>
        <item>
          <key>deployment.trigger.afterSuccessfulDeployment.triggeringEnvironmentId</key>
          <value>19234819</value>
        </item>
      </config>
    </triggerDefinition>
  </triggers>
  <bambooDelimiterParsingDisabled>true</bambooDelimiterParsingDisabled>
</configuration>

您发布的XML无效。您的代码示例不起作用。。。不允许在没有命名空间声明的情况下使用命名空间前缀。此外,您的示例缺少结束标题标记

我纠正了这个

DECLARE @yourTbl TABLE(ID INT, YourXML NTEXT);
INSERT INTO @yourTbl VALUES
(1,N'<my:Header xmlns:my="DummyUrl">
<my:Requestor>Mehrlein, Roswitha</my:Requestor>
<my:RequestorUserName>SJM\MehrlR01</my:RequestorUserName>
<my:RequestorEmail>RMehrlein@SJM.com</my:RequestorEmail>   
<my:HRContact>Roswita  Mehrlein, Beatrice Porta</my:HRContact>
<my:Entity>SJM Germany</my:Entity>
<my:Department>HR/Administration</my:Department>
<my:PositionTitle>Sales Representative</my:PositionTitle>     
<my:JobDescription>x0lGQRQAAAABAAAAAAAAAAAeAQAyAAAAVgBAAAAA=</my:JobDescription>
<my:PositionDepartment>Sales</my:PositionDepartment>
</my:Header>');

--Lazy approach
SELECT ID
      ,CAST(CAST(YourXml AS NVARCHAR(MAX)) AS XML).value(N'(//*:PositionDepartment)[1]','nvarchar(max)')
FROM @yourTbl;


--explicit approach
WITH XMLNAMESPACES('DummyUrl' AS my)
SELECT ID
      ,CAST(CAST(YourXml AS NVARCHAR(MAX)) AS XML).value(N'(/my:Header/my:PositionDepartment)[1]','nvarchar(max)')
FROM @yourTbl
更新2 根据您的编辑,下面返回一个空值。这很好,因为它表明演员阵容是成功的

尝试使用通配符跳过此命名空间:

SELECT 
CAST(
    REPLACE(CAST(de.TRIGGERS_XML_DATA AS VARCHAR(MAX)), 'encoding="utf-16"', '')
  AS XML).value('(*:triggers/*:triggerDefinition/*:config/*:item/*:value)[1]', 'NVARCHAR(max)') as Item, de.ENVIRONMENT_ID
from dbo.DEPLOYMENT_ENVIRONMENT as de
where de.ENVIRONMENT_ID = 19234819
这应该更好:

SELECT 
CAST(CAST(de.TRIGGERS_XML_DATA AS NVARCHAR(MAX)) AS XML).value('(*:triggers/*:triggerDefinition/*:config/*:item/*:value)[1]', 'NVARCHAR(max)') as Item, de.ENVIRONMENT_ID
from dbo.DEPLOYMENT_ENVIRONMENT as de
where de.ENVIRONMENT_ID = 19234819
更新3 我宁愿删掉完整的声明。您发布的示例如下所示

DECLARE @DEPLOYMENT_ENVIRONMENT TABLE(ENVIRONMENT_ID INT, TRIGGERS_XML_DATA NTEXT);
INSERT INTO @DEPLOYMENT_ENVIRONMENT VALUES
(19234819,N'<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configuration xml:space="preserve">

<triggers>
    <defined>true</defined>
    <triggerDefinition>
      <id>1</id>
      <name>After successful deployment</name>
      <userDescription/>
      <isEnabled>true</isEnabled>
      <pluginKey>com.atlassian.bamboo.triggers.atlassian-bamboo-triggers:afterSuccessfulDeployment</pluginKey>
      <triggeringRepositories/>
      <config>
        <item>
          <key>deployment.trigger.afterSuccessfulDeployment.triggeringEnvironmentId</key>
          <value>19234819</value>
        </item>
      </config>
    </triggerDefinition>
  </triggers>
  <bambooDelimiterParsingDisabled>true</bambooDelimiterParsingDisabled>
</configuration>');

WITH Casted AS
(
    SELECT CAST(de.TRIGGERS_XML_DATA AS NVARCHAR(MAX)) AS XmlAsSting
    FROM @DEPLOYMENT_ENVIRONMENT as de
    where de.ENVIRONMENT_ID = 19234819
)
SELECT CAST(SUBSTRING(XmlAsSting,CHARINDEX('?>',XmlAsSting)+2,8000) AS XML).value('(/*:configuration/*:triggers/*:triggerDefinition/*:config/*:item/*:value)[1]', 'NVARCHAR(max)') as Item
FROM Casted;

@Shungo那不是我的xml这是我看到的一个例子我的在名为trigger_xml_data的列中有大量数据,这就是我遇到的问题,所以我想将xml设为表中的列,但在尝试这样做时会出错so@GuinnessIsLife,在不了解实际XML的情况下,应该如何帮助您?您应该尽量减少真正的XML,而不改变相关的结构**。顺便说一句:如果没有发生多次,惰性方法应该可以正常工作…@GuinnessIsLife只需尝试从dbo.DEPLOYMENT\u环境中选择CASTCASTde.triggers\u xml\u data作为NVARCHARMAX作为xml作为de。这应该返回xml-只要它是有效的…我修复了该错误,但现在当我选择CAST REPLACECASTde.triggers\u xml\u data作为VARCHARMAX时,我得到一个空值,“encoding=utf-16”,作为XML.value“triggers/triggerDefinition/config/item/value[1]”,“NVARCHARmax”作为item,de.ENVIRONMENT\u ID来自dbo.DEPLOYMENT\u ENVIRONMENT作为de,其中de.ENVIRONMENT\u ID=19234819ntext、text和image数据类型将在SQL Server的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。改用nvarcharmax、varcharmax和varbinarymax。-如果您有XML数据,那么您应该真正使用XML数据类型——这就是它的用途@marc_我同意,但是这个数据库是由Bambon创建的,所以我没有选择类型,只是需要使用它们。
SELECT 
CAST(CAST(de.TRIGGERS_XML_DATA AS NVARCHAR(MAX)) AS XML).value('(*:triggers/*:triggerDefinition/*:config/*:item/*:value)[1]', 'NVARCHAR(max)') as Item, de.ENVIRONMENT_ID
from dbo.DEPLOYMENT_ENVIRONMENT as de
where de.ENVIRONMENT_ID = 19234819
DECLARE @DEPLOYMENT_ENVIRONMENT TABLE(ENVIRONMENT_ID INT, TRIGGERS_XML_DATA NTEXT);
INSERT INTO @DEPLOYMENT_ENVIRONMENT VALUES
(19234819,N'<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configuration xml:space="preserve">

<triggers>
    <defined>true</defined>
    <triggerDefinition>
      <id>1</id>
      <name>After successful deployment</name>
      <userDescription/>
      <isEnabled>true</isEnabled>
      <pluginKey>com.atlassian.bamboo.triggers.atlassian-bamboo-triggers:afterSuccessfulDeployment</pluginKey>
      <triggeringRepositories/>
      <config>
        <item>
          <key>deployment.trigger.afterSuccessfulDeployment.triggeringEnvironmentId</key>
          <value>19234819</value>
        </item>
      </config>
    </triggerDefinition>
  </triggers>
  <bambooDelimiterParsingDisabled>true</bambooDelimiterParsingDisabled>
</configuration>');

WITH Casted AS
(
    SELECT CAST(de.TRIGGERS_XML_DATA AS NVARCHAR(MAX)) AS XmlAsSting
    FROM @DEPLOYMENT_ENVIRONMENT as de
    where de.ENVIRONMENT_ID = 19234819
)
SELECT CAST(SUBSTRING(XmlAsSting,CHARINDEX('?>',XmlAsSting)+2,8000) AS XML).value('(/*:configuration/*:triggers/*:triggerDefinition/*:config/*:item/*:value)[1]', 'NVARCHAR(max)') as Item
FROM Casted;