2011-04-20 3 views
0

다른 애플리케이션으로 전송되는 XML 문서를 생성하는 데 XML EXPLICIT을 사용하고 있습니다. 태그는 라벨/값이며 순서는 중요합니다. 다른 앱은받은 순서대로 라벨과 값을 표시하기 때문에 중요합니다.XML EXPLICIT * NOT *을 알파벳 순으로 재주문하는 방법은 무엇입니까?

N  | V 
_______________ 
Objective - XXX 
State  - New York 
Country - US 

내가 그러나

<X> 
    <T> 
    <N>Objective</N> 
    <V>XXX</V> 
    </T> 
    <T> 
    <N>State</N> 
    <V>New York</V> 
    </T> 
    <T> 
    <N>Country</N> 
    <V>US</V> 
    </T> 
</X> 

를 얻을를 받고 메신저를 기대하고 사용하는 정보 I의 예는 N 태그

<X> 
    <T> 
    <N>Country</N> 
    <V>US</V> 
    </T> 
    <T> 
    <N>Objective</N> 
    <V>XXX</V> 
    </T> 
    <T> 
    <N>State</N> 
    <V>New York</V> 
    </T> 

</X> 

이 알파벳 순으로 정렬 검색어입니다.

당신이 돈 만약 내가 최종 출력에 의해 주문을 보이지 않는210
CREATE PROCEDURE [dbo].[XML]  
@iPackageId INT,  
@iUserId INT  
AS  
BEGIN  
SET NOCOUNT ON  

DECLARE @iPluginId INT, @iIndex INT, @sLabel VARCHAR(100), @sValue VARCHAR(200), @sField VARCHAR(4000), @sQuery VARCHAR(8000)  

DECLARE @MySettings TABLE(iIndex INT PRIMARY KEY IDENTITY, iSettingsId INT, sLabel VARCHAR(100), sField VARCHAR(4000))  
DECLARE @Fields TABLE(sLabel VARCHAR(100), sValue VARCHAR(400))  

SET @iPluginId = (SELECT iPluginId FROM trnPackage WHERE iPackageId = @iPackageId)  
SET @iIndex = 1  
SET @sQuery = ''  

//WE get for the N and a sqlstatement to get the V from the catPluginSettings table, and order them by iDisplayOrder, and insert them in temp MySettings table. 
//By executing that sql statement we get the actual value of for V, and save the N and V in @Fields table 

INSERT INTO @MySettings  
SELECT  
    iSettingsId,sLabel, sField  
FROM catPluginSettings  
WHERE iPluginId = @iPluginId  
    AND bActive = 1  
ORDER BY iDisplayOrder  



WHILE EXISTS (SELECT iIndex FROM @MySettings)  
BEGIN  
    SELECT  
    @sLabel = sLabel,  
    @sField = sField + CAST(@iPackageId AS varchar)  
    FROM @MySettings T  
    WHERE iIndex = @iIndex  

    -- GET VALUE FROM sFiled  
    DECLARE @sResult NVARCHAR(400)  

    DECLARE @SelectStatement NVARCHAR(4000)  
    DECLARE @FullStatement NVARCHAR(4000)  
    DECLARE @ParameterList NVARCHAR(500)   

    SET @ParameterList = '@sResult NVARCHAR(400) OUTPUT'   
    SET @FullStatement = @sField  

    EXECUTE sp_executesql @FullStatement, @ParameterList, @sResult = @sResult OUTPUT  
IF NOT @sLabel IS NULL AND NOT @sResult IS NULL BEGIN 
    INSERT INTO @Fields VALUES (@sLabel ,@sResult)  
END 
    -- END GET VALUE FROM sField  

    DELETE @MySettings WHERE iIndex = @iIndex  

    SET @iIndex = @iIndex + 1  
END  



-- ROOT  
SELECT distinct 
    1 as Tag,  
    NULL as Parent,  
    NULL [X!1],  
    BB.iBBId as [X!1!A!element],  
    T.sPckCode as [X!1!B!element],  
    SUBSTRING(cU.sNetLogin, CHARINDEX('\',cU.sNetLogin)+1, LEN(cU.sNetLogin)) as [X!1!C!element],  
    cUR.sFullName as [X!1!D!element],  
CAST(DATEPART(YEAR, T.dCreationDate) AS VARCHAR)  
    + dbo.PadLeft(CAST(DATEPART(MONTH, T.dCreationDate) AS VARCHAR),2,'0')  
    + dbo.PadLeft(CAST(DATEPART(DAY, T.dCreationDate) AS VARCHAR),2,'0')  
    + dbo.PadLeft(CAST(DATEPART(HOUR, T.dCreationDate) AS VARCHAR),2,'0')  
    + dbo.PadLeft(CAST(DATEPART(MINUTE, T.dCreationDate) AS VARCHAR),2,'0') 
AS [X!1!E!element],  
    cP.sAppShortName as [X!1!F!element],  
    CONVERT (DECIMAL (16, 2), T.mAmountUSD) as [X!1!G!element], ---> CAST a 2 Decimales <--  
    NULL AS [T!2!N!element],  
    NULL AS [T!2!V!element]  
FROM trnPackage T  
INNER JOIN trnPkgBB BB ON T.iPackageId = BB.iPackageId  
INNER JOIN relPackageUser R ON T.iPackageId = R.iPackageId --AND R.bIsSysAdmin = 0 AND R.bIsBackupUser = 0  
INNER JOIN catUser cU ON R.iUserId = cU.iUserId  
INNER JOIN catUser cUR ON T.iUserId = cUR.iUserId  
INNER JOIN catPlugin cP ON T.iPluginId = cP.iPluginId  
WHERE (T.iPackageId = @iPackageId AND R.iUserId = @iUserId)  
    AND (BB.iPackageId = @iPackageId AND BB.iApproverId = @iUserId)  
    AND BB.iBBStatusId <> (SELECT iStatusId FROM catStatus WHERE sStatusName = 'Completed')  

-- EXTRA INFO  
UNION  
SELECT  
    2 AS Tag,  
    1 AS Parent,  
    NULL,  
    NULL,  
    NULL,  
    NULL,  
    NULL,  
    NULL,  
    NULL,  
    NULL,  
    sLabel,  
    sValue  
FROM @Fields T  
FOR XML EXPLICIT  
    select * from @Fields 
END  
+1

귀하의 질의를보십시오. – NotMe

+0

@Chris Lively에 덧붙여 –

+1

'UNION'은'SORT'가 중복을 없애고 (거기에는'distinct'도 있습니다). 그러나 특정 ORDER BY가 필요한 경우 추가해야합니다. –

답변

4

... 그것없이

당신이 XML이 생성되는 순서를 제어 할 수 없습니다.

'이 질문을 참조하십시오 귀하의 노동 조합에 주문을 신청하는 방법을 알고 계십시오. SQL Query - Using Order By in UNION

+0

FOR XML EXPLICIT은 결과를 "명시 적으로"주문해야합니다. –

관련 문제