Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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查询获取Xml都不同的行_Sql_Sql Server_Xml - Fatal编程技术网

SQL查询获取Xml都不同的行

SQL查询获取Xml都不同的行,sql,sql-server,xml,Sql,Sql Server,Xml,这可能还不错,我只是不知道如何最好地表达这个问题 我喜欢Xml <Names> <Name Language="English"> <Value></Value> <FirstName /> <MiddleName /> <LastName /> <IsPrimary>True</IsPrimary> </Name> </N

这可能还不错,我只是不知道如何最好地表达这个问题

我喜欢Xml

<Names>
  <Name Language="English">
    <Value></Value>
    <FirstName />
    <MiddleName />
    <LastName />
    <IsPrimary>True</IsPrimary>
  </Name>
</Names>
其中名称可以有多个名称。我需要得到的行中有不止一行我已经完成了,并且所有的值,即连接的第一个/中间的/最后的都是不同的

所以本质上我需要确保所有的值都是唯一的。我不确定如何在xml中选择distinct


感谢您的帮助

下面是示例代码,它在第一个查询中输出原始详细信息,在第二个查询中输出不同的值。第一个查询将帮助您验证第二个查询的结果。下面是一个例子


您需要将一些Linq写入XML,请查看此处的链接。你想在哪里做这件事?在C或T-SQL中?尝试在T-SQLWoops中执行此操作时,我一定错过了TSQL,我很抱歉,我以为这是在C中。我标记C是出于习惯我的错误
CREATE TABLE #Temp
    (XmlString XML);

INSERT INTO #Temp (XmlString)
VALUES 
    ('<Names>
      <Name Language="English">
        <Value></Value>
        <FirstName>Hello Goodbye</FirstName>
        <MiddleName />
        <LastName />
        <IsPrimary>True</IsPrimary>
      </Name>
      <Name Language="English">
        <Value></Value>
        <FirstName>Hello</FirstName>
        <MiddleName />
        <LastName>Goodbye</LastName>
        <IsPrimary>True</IsPrimary>
      </Name>
      <Name Language="English">
        <Value></Value>
        <FirstName>Hello</FirstName>
        <MiddleName />
        <LastName>Goodbye</LastName>
        <IsPrimary>True</IsPrimary>
      </Name>
      <Name Language="English">
        <Value></Value>
        <FirstName>Hello</FirstName>
        <MiddleName>There</MiddleName>
        <LastName>Goodbye</LastName>
        <IsPrimary>True</IsPrimary>
      </Name>
      <Name Language="English">
        <Value></Value>
        <FirstName>No</FirstName>
        <MiddleName>You</MiddleName>
        <LastName>Don''t</LastName>
        <IsPrimary>True</IsPrimary>
      </Name>
    </Names>'), 
    ('<Names>
      <Name Language="English">
        <Value></Value>
        <FirstName>Another</FirstName>
        <MiddleName />
        <LastName>Record</LastName>
        <IsPrimary>True</IsPrimary>
      </Name>
      <Name Language="English">
        <Value></Value>
        <FirstName>No</FirstName>
        <MiddleName>You</MiddleName>
        <LastName>Don''t</LastName>
        <IsPrimary>True</IsPrimary>
      </Name>
    </Names>');

SELECT FirstName = NULLIF(SomeNames.value('(FirstName)[1]', 'VARCHAR(MAX)'), '')
    , MiddleName = NULLIF(SomeNames.value('(MiddleName)[1]', 'VARCHAR(MAX)'), '')
    , LastName = NULLIF(SomeNames.value('(LastName)[1]', 'VARCHAR(MAX)'), '')
FROM #Temp src (NOLOCK) 
CROSS APPLY XmlString.nodes('/Names/Name') AS ShreddedXml (SomeNames);

SELECT DISTINCT FirstName = REPLACE(RTRIM(LTRIM(CONCAT(NULLIF(SomeNames.value('(FirstName)[1]', 'VARCHAR(MAX)'), ''), ' ', NULLIF(SomeNames.value('(MiddleName)[1]', 'VARCHAR(MAX)'), ''), ' ', NULLIF(SomeNames.value('(LastName)[1]', 'VARCHAR(MAX)'), '')))), '  ', ' ')
FROM #Temp src (NOLOCK) 
CROSS APPLY XmlString.nodes('/Names/Name') AS ShreddedXml (SomeNames);