表#tmpNodesToReplace; 投递表#求职者; 假设此表有数千条记录,我需要搜索xml并将其替换为欢迎使用StackOverflow!你可以编辑问题来完成它,目前还不清楚你在问什么Hi-Raj,如果你想显示XML,你必须将其格式化为代码(带背面

表#tmpNodesToReplace; 投递表#求职者; 假设此表有数千条记录,我需要搜索xml并将其替换为欢迎使用StackOverflow!你可以编辑问题来完成它,目前还不清楚你在问什么Hi-Raj,如果你想显示XML,你必须将其格式化为代码(带背面,xml,sql-server-2008,xquery-sql,Xml,Sql Server 2008,Xquery Sql,表#tmpNodesToReplace; 投递表#求职者; 假设此表有数千条记录,我需要搜索xml并将其替换为欢迎使用StackOverflow!你可以编辑问题来完成它,目前还不清楚你在问什么Hi-Raj,如果你想显示XML,你必须将其格式化为代码(带背面记号)Hi-Raj,欢迎!由于你是新来的,请允许我一个提示:你提出了一个问题,我花了相当多的时间来回答,然后由于你的补充再次回答。如果你找到了自己的解决方案,你应该给未来的读者一个自我回答。如果你不再需要任何答案,礼貌的做法是发表简短的评论。如

表#tmpNodesToReplace; 投递表#求职者;
假设此表有数千条记录,我需要搜索xml并将其替换为欢迎使用StackOverflow!你可以编辑问题来完成它,目前还不清楚你在问什么Hi-Raj,如果你想显示XML,你必须将其格式化为代码(带背面记号)Hi-Raj,欢迎!由于你是新来的,请允许我一个提示:你提出了一个问题,我花了相当多的时间来回答,然后由于你的补充再次回答。如果你找到了自己的解决方案,你应该给未来的读者一个自我回答。如果你不再需要任何答案,礼貌的做法是发表简短的评论。如果你对我的回答有疑问,请说明一些细节,我很乐意提供帮助。如果我的回答解决了您的问题,请在验收单上打勾。假设这个表有上千条记录,我需要搜索xml并替换为欢迎使用StackOverflow!你可以编辑问题来完成它,目前还不清楚你在问什么Hi-Raj,如果你想显示XML,你必须将其格式化为代码(带背面记号)Hi-Raj,欢迎!由于你是新来的,请允许我一个提示:你提出了一个问题,我花了相当多的时间来回答,然后由于你的补充再次回答。如果你找到了自己的解决方案,你应该给未来的读者一个自我回答。如果你不再需要任何答案,礼貌的做法是发表简短的评论。如果你对我的回答有疑问,请说明一些细节,我很乐意提供帮助。如果我的回答解决了您的问题,请在验收单上打勾。还有。谢谢你@shnugo。现在我只想用“”替换节点“”,并将“”替换为“否”,在脚本执行之前XML对我不起作用:3.0 3.5 9.5 16.0 4.5 4.0 4.5@Raj“不起作用”是不够的。。。什么不起作用?错误?输出错误?您发布的XML的预期结果是什么?谢谢u@shnugo。现在我只想将节点“”替换为“”,并将“”替换为“否”,因为在脚本执行之前XML对我不起作用:3.0 3.5 9.5 16.0 4.5 4.0 4.5@Raj“不起作用”是不够的。。。什么不起作用?错误?输出错误?您发布的XML的预期结果是什么?这不是我的代码吗?对不起,我不明白这个。。。这是您提供给未来读者的解决方案还是需要帮助的代码?这不是我的代码吗?对不起,我不明白这个。。。这是您提供给未来读者的解决方案还是需要帮助的代码?
                IF EXISTS(
                  SELECT table_name FROM information_schema.tables 
                  WHERE table_name = 'JobCandidates')
                DROP TABLE JobCandidates;
                -- Create JobCandidates table 
                CREATE TABLE JobCandidates(
                  CandidateId INT PRIMARY KEY,
                -- Create typed XML column
                  CandidateResume XML 
                    (DOCUMENT HumanResources.HRResumeSchemaCollection) NULL,
                -- Create untyped XML column
                  CandidateRating XML NULL);
                -- Insert data into the typed column
                INSERT INTO JobCandidates (CandidateId, CandidateResume)
                  (SELECT JobCandidateId, [Resume]
                  FROM HumanResources.JobCandidate
                  WHERE JobCandidateId = 1);
                UPDATE JobCandidates
                SET CandidateRating =
                  '<Ratings>       
                    <Rating Ratingtype="unknown">       
                      <AppliedKnowledge>3.0</AppliedKnowledge>       
                      <ToolSkills>3.5</ToolSkills>       
                    </Rating>       
                    <Rating Ratingtype="known">       
                      <Experience>9.5</Experience>       
                      <Education>16.0</Education>       
                      <DbDevelopment>4.5</DbDevelopment>       
                    </Rating>
                      <Rating Ratingtype="unknown">       
                      <AppliedKnowledge>4.0</AppliedKnowledge>       
                      <ToolSkills>4.5</ToolSkills>       
                    </Rating>       
                  </Ratings>';
                SELECT * FROM JobCandidates;
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowIndex
      ,ROW_NUMBER() OVER(PARTITION BY CandidateId ORDER BY (SELECT NULL)) AS NodeIndex
      ,CandidateId
INTO #tmpNodesToReplace
FROM #JobCandidates
CROSS APPLY CandidateRating.nodes('/Ratings/Rating[@Ratingtype="unknown"]') AS A(B);

DECLARE @I INT=1;
DECLARE @CountNodes INT=(SELECT COUNT(*) FROM #tmpNodesToReplace);
WHILE 1 = 1
BEGIN
    UPDATE #JobCandidates
    SET CandidateRating.modify('insert <SuperRating>{(/Ratings/Rating[@Ratingtype="unknown"])[sql:column("NodeIndex")]/*}</SuperRating> into (/Ratings)[1]')
    FROM #JobCandidates
    INNER JOIN #tmpNodesToReplace ON #JobCandidates.CandidateId = #tmpNodesToReplace.CandidateId
    WHERE #tmpNodesToReplace.RowIndex=@I;

  IF @I>@CountNodes
    BREAK;

  SET @I = @I + 1
END

UPDATE #JobCandidates
SET CandidateRating.modify('delete /Ratings/Rating[@Ratingtype="unknown"]');
CREATE TABLE #JobCandidates(
    CandidateId INT PRIMARY KEY,
    CandidateRating XML NULL);

INSERT INTO #JobCandidates (CandidateId, CandidateRating) VALUES
 (1 -- test row with two "unknown" Ratings
  ,'<Ratings>       
    <Rating Ratingtype="unknown">       
        <AppliedKnowledge>3.0</AppliedKnowledge>       
        <ToolSkills>3.5</ToolSkills>       
    </Rating>       
    <Rating Ratingtype="known">       
        <Experience>9.5</Experience>       
        <Education>16.0</Education>       
        <DbDevelopment>4.5</DbDevelopment>       
    </Rating>
        <Rating Ratingtype="unknown">       
        <AppliedKnowledge>4.0</AppliedKnowledge>       
        <ToolSkills>4.5</ToolSkills>       
    </Rating>       
    </Ratings>')
, (2 --test row with one "unknown" Rating
  ,'<Ratings>       
    <Rating Ratingtype="other than unknown">       
        <AppliedKnowledge>3.0</AppliedKnowledge>       
        <ToolSkills>3.5</ToolSkills>       
    </Rating>       
    <Rating Ratingtype="known">       
        <Experience>9.5</Experience>       
        <Education>16.0</Education>       
        <DbDevelopment>4.5</DbDevelopment>       
    </Rating>
        <Rating Ratingtype="unknown">       
        <AppliedKnowledge>4.0</AppliedKnowledge>       
        <ToolSkills>4.5</ToolSkills>       
    </Rating>       
    </Ratings>')
, (3 --test row with n "unknown" Rating
  ,'<Ratings>       
    <Rating Ratingtype="other than unknown">       
        <AppliedKnowledge>3.0</AppliedKnowledge>       
        <ToolSkills>3.5</ToolSkills>       
    </Rating>       
    <Rating Ratingtype="known">       
        <Experience>9.5</Experience>       
        <Education>16.0</Education>       
        <DbDevelopment>4.5</DbDevelopment>       
    </Rating>
        <Rating Ratingtype="other than unknown">       
        <AppliedKnowledge>4.0</AppliedKnowledge>       
        <ToolSkills>4.5</ToolSkills>       
    </Rating>       
    </Ratings>');

--Find rows with any "unknown" ratings
SELECT * FROM #JobCandidates
WHERE CandidateRating.exist('/Ratings/Rating[@Ratingtype="unknown"]')=1;

--Find all rows with "unknown" (ID=1 showing 2 entries
SELECT CandidateId
      ,A.B.query('.') 
FROM #JobCandidates
CROSS APPLY CandidateRating.nodes('/Ratings/Rating[@Ratingtype="unknown"]') AS A(B);

DROP TABLE #JobCandidates;
            CREATE TABLE #JobCandidates(
                CandidateId INT PRIMARY KEY,
                CandidateRating XML NULL);

            INSERT INTO #JobCandidates (CandidateId, CandidateRating) VALUES
             (1 -- test row with two "unknown" Ratings
              ,'<Ratings>       
                <Rating Ratingtype="unknown">       
                    <AppliedKnowledge>3.0</AppliedKnowledge>       
                    <ToolSkills>3.5</ToolSkills>       
                </Rating>       
                <Rating Ratingtype="known">       
                    <Experience>9.5</Experience>       
                    <Education>16.0</Education>       
                    <DbDevelopment>4.5</DbDevelopment>       
                </Rating>
                    <Rating Ratingtype="unknown">       
                    <AppliedKnowledge>4.0</AppliedKnowledge>       
                    <ToolSkills>4.5</ToolSkills>       
                </Rating>       
                </Ratings>')
            , (2 --test row with one "unknown" Rating
              ,'<Ratings>       
                <Rating Ratingtype="other than unknown">       
                    <AppliedKnowledge>3.0</AppliedKnowledge>       
                    <ToolSkills>3.5</ToolSkills>       
                </Rating>       
                <Rating Ratingtype="known">       
                    <Experience>9.5</Experience>       
                    <Education>16.0</Education>       
                    <DbDevelopment>4.5</DbDevelopment>       
                </Rating>
                    <Rating Ratingtype="unknown">       
                    <AppliedKnowledge>4.0</AppliedKnowledge>       
                    <ToolSkills>4.5</ToolSkills>       
                </Rating>       
                </Ratings>')
            , (3 --test row with n "unknown" Rating
              ,'<Ratings>       
                <Rating Ratingtype="other than unknown">       
                    <AppliedKnowledge>3.0</AppliedKnowledge>       
                    <ToolSkills>3.5</ToolSkills>       
                </Rating>       
                <Rating Ratingtype="known">       
                    <Experience>9.5</Experience>       
                    <Education>16.0</Education>       
                    <DbDevelopment>4.5</DbDevelopment>       
                </Rating>
                    <Rating Ratingtype="other than unknown">       
                    <AppliedKnowledge>4.0</AppliedKnowledge>       
                    <ToolSkills>4.5</ToolSkills>       
                </Rating>       
                </Ratings>');

            --Find rows with any "unknown" ratings
            SELECT * FROM #JobCandidates
            WHERE CandidateRating.exist('/Ratings/Rating[@Ratingtype="unknown"]')=1;

            --Find all rows with "unknown" (ID=1 showing 2 entries
            SELECT CandidateId
                  ,A.B.query('.') 
            FROM #JobCandidates
            CROSS APPLY CandidateRating.nodes('/Ratings/Rating[@Ratingtype="unknown"]') AS A(B);

            --change '<Rating Ratingtype="unknown">' to '<SuperRating Ratingtype="unknown">
            SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowIndex
                  ,ROW_NUMBER() OVER(PARTITION BY CandidateId ORDER BY (SELECT NULL)) AS NodeIndex
                  ,CandidateId
            INTO #tmpNodesToReplace
            FROM #JobCandidates
            CROSS APPLY CandidateRating.nodes('/Ratings/Rating[@Ratingtype="unknown"]') AS A(B);

            DECLARE @I INT=1;
            DECLARE @CountNodes INT=(SELECT COUNT(*) FROM #tmpNodesToReplace);
            WHILE 1 = 1
            BEGIN
             UPDATE #JobCandidates
                SET CandidateRating.modify('insert <SuperRating Ratingtype="unknown">{(/Ratings/Rating[@Ratingtype="unknown"])[sql:column("NodeIndex")]/*}</SuperRating> before (//Rating)[1]')
                FROM #JobCandidates
                INNER JOIN #tmpNodesToReplace ON #JobCandidates.CandidateId = #tmpNodesToReplace.CandidateId
                WHERE #tmpNodesToReplace.RowIndex=@I;



                update #JobCandidates set
                CandidateRating.modify('replace value of (/Ratings/Rating/@Ratingtype)[1] with "delete"')
                FROM #JobCandidates INNER JOIN #tmpNodesToReplace ON #JobCandidates.CandidateId = #tmpNodesToReplace.CandidateId
                WHERE #tmpNodesToReplace.RowIndex=@I;

                UPDATE #JobCandidates
                SET CandidateRating.modify('delete /Ratings/Rating[@Ratingtype="delete"]') FROM #JobCandidates where CandidateRating is not null ;

              IF @I>@CountNodes
                BREAK;

              SET @I = @I + 1
            END

            --drop table #JobCandidates
            --drop table #tmpNodesToReplace
            --select * from #JobCandidates
CREATE TABLE #JobCandidates(
    CandidateId INT PRIMARY KEY,
    CandidateRating XML NULL);

INSERT INTO #JobCandidates (CandidateId, CandidateRating) VALUES
 (1 -- test row with two "unknown" Ratings
  ,'<Ratings>
  <Rating Ratingtype="unknown">
    <AppliedKnowledge>3.0</AppliedKnowledge>
    <ToolSkills>3.5</ToolSkills>
  </Rating>
  <Rating Ratingtype="known">
    <Experience>9.5</Experience>
    <Education>16.0</Education>
    <DbDevelopment>4.5</DbDevelopment>
  </Rating>
  <Rating Ratingtype="unknown">
    <AppliedKnowledge>4.0</AppliedKnowledge>
    <ToolSkills>4.5</ToolSkills>
  </Rating>
</Ratings>');

SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowIndex
      ,ROW_NUMBER() OVER(PARTITION BY CandidateId ORDER BY (SELECT NULL)) AS NodeIndex
      ,CandidateId
INTO #tmpNodesToReplace
FROM #JobCandidates
CROSS APPLY CandidateRating.nodes('/Ratings/Rating[@Ratingtype="unknown"]') AS A(B);

DECLARE @I INT=1;
DECLARE @CountNodes INT=(SELECT COUNT(*) FROM #tmpNodesToReplace);
WHILE 1 = 1
BEGIN
    UPDATE #JobCandidates
    SET CandidateRating.modify('insert <SuperRating>{(/Ratings/Rating[@Ratingtype="unknown"])[sql:column("NodeIndex")]/*}</SuperRating> into (/Ratings)[1]')
    FROM #JobCandidates
    INNER JOIN #tmpNodesToReplace ON #JobCandidates.CandidateId = #tmpNodesToReplace.CandidateId
    WHERE #tmpNodesToReplace.RowIndex=@I;

  IF @I>@CountNodes
    BREAK;

  SET @I = @I + 1
END

UPDATE #JobCandidates
SET CandidateRating.modify('delete /Ratings/Rating[@Ratingtype="unknown"]');

SELECT * FROM #JobCandidates;

/* Both "Unknown" Ratings are replaced
<Ratings>
  <Rating Ratingtype="known">
    <Experience>9.5</Experience>
    <Education>16.0</Education>
    <DbDevelopment>4.5</DbDevelopment>
  </Rating>
  <SuperRating>
    <AppliedKnowledge>3.0</AppliedKnowledge>
    <ToolSkills>3.5</ToolSkills>
  </SuperRating>
  <SuperRating>
    <AppliedKnowledge>4.0</AppliedKnowledge>
    <ToolSkills>4.5</ToolSkills>
  </SuperRating>
</Ratings>
*/

DROP TABLE #tmpNodesToReplace;
DROP TABLE #JobCandidates;