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