2013-07-01 31 views
0

我已經繼承了1500行存儲過程,該過程聲明瞭在整個過程的整個生命週期中經常改變狀態的大量變量。我們有一個邏輯錯誤,證明它非常難以追蹤,因此有責任將有限時間的變量寫入日誌表。我的解決方案是獲取每個變量並將它們填充到XML中,並將它們記錄在沒有索引的表中,以便在寫入過程中儘可能快地進行記錄。這是不得已而爲之的,但我們有一百萬美元的差距來解決這個問題,而不是很多時間去挖掘。FOR XML無FROM

因此,解決方案將是這樣的一個星期內,當我們運行PROC:

  • 過程聲明並初始化數據到變量。
  • 函數被調用,記錄狀態
  • 程序做了一大堆更多的代碼改變狀態
  • 函數被調用,記錄狀態
  • 程序做大量的多。
  • 函數被調用來記錄狀態。

我的問題是這樣的。

DECLARE @TESTSTRING VARCHAR(MAX) 
DECLARE @TESTINTEGER INT 
DECLARE @TESTDATE DATETIME = GETDATE() 

SELECT @TESTSTRING, @TESTINTEGER, @TESTDATE FOR XML... 

是否可以通過以某種方式選擇它們來以XML的形式輸出變量?我通常知道FOR XML語法要求它在FROM子句之後。在這種情況下,我不會有。如果情況並非如此......這有多昂貴?

DECLARE @TESTSTRING VARCHAR(MAX) 
DECLARE @TESTINTEGER INT 
DECLARE @TESTDATE DATETIME = GETDATE() 

SELECT 
    * 
FROM 
    (SELECT @TESTSTRING AS TESTSTRING, @TESTINTEGER AS TESTINTEGER, @TESTDATE AS TESTDATE) AS S 
FOR XML PATH('VAR'), ROOT('TESTTABLE') 

回答

1

這將工作得很好,儘管只要被選擇的變量具有別名,您可以跳過子查詢。另外,請考慮如何使用isnull函數在xml中表示空參數值。

DECLARE @TESTSTRING VARCHAR(MAX) 
DECLARE @TESTINTEGER INT 
DECLARE @TESTDATE DATETIME = GETDATE() 
set @TESTSTRING = 'xxx' 
set @TESTINTEGER = 2 

declare @outputxml as xml 
set @outputxml = (
    SELECT isnull(@TESTSTRING,'--NULL--') AS TESTSTRING, isnull(@TESTINTEGER,-1) AS TESTINTEGER, isnull(@TESTDATE,'1/1/1900') AS TESTDATE 
    FOR XML PATH('VAR'), ROOT('TESTTABLE')`enter code here` 
    ) 

select @outputxml 

+0

我沒有把它在我的例子,但我會在ELEMENTS XSINIL這將只是PLACEHOLD空值進行定位焊。我並不擔心你的例子中所做的初始化。但我應該指定。感謝你的快速回復! –

+0

其實,這確實回答了我的問題。剛剛嘗試了您使用@outputxml變量所做的變體。非常感謝! –

0

下面是我在做什麼,非抽象的。完美的作品。我已經無視HIPPA的一切。

DECLARE @CLAIMID VARCHAR(MAX) = 'SOMECLAIMID' 
DECLARE @CoreClaimTotalPaid MONEY 
DECLARE @ClaimTotalAmt MONEY 
DECLARE @MemID CHAR(15) 
DECLARE @CLMStartDate DATETIME 
DECLARE @CLMEndDate DATETIME 
DECLARE @MonthlyCostShareID INT 
DECLARE @MonthlyCostShareIDRollback INT 
DECLARE @MonthlyCostShareAmt MONEY 
DECLARE @MonthlyShareAmtUsed MONEY 
DECLARE @MonthlyCostShareRateCode CHAR(2) 
DECLARE @SOCBalance MONEY 
DECLARE @CDTotalPaid MONEY 
DECLARE @CDTotalSOC MONEY 
DECLARE @PROC_USER CHAR(15) 
DECLARE @CostShareClaimID INT 
DECLARE @AdjudicatedCostShareAmtApplied MONEY 
DECLARE @PrevSOCAmt MONEY 
DECLARE @totalpaid MONEY 
DECLARE @Message varchar(200) 
DECLARE @getdate DATETIME 
DECLARE @IHCMFPcutoff SMALLDATETIME 


SELECT @CLAIMID ClaimID,@CoreClaimTotalPaid CoreClaimTotalPaid,@ClaimTotalAmt ClaimTotalAmt,@MemID MemID,@CLMStartDate CLMStartDate,@CLMEndDate CLMEndDate, 
     @MonthlyCostShareID MonthlyCostShareID,@MonthlyCostShareIDRollback MonthlyCostShareIDRollback,@MonthlyCostShareAmt MonthlyCostShareAmt, 
     @MonthlyShareAmtUsed MonthlyShareAmtUsed,@MonthlyCostShareRateCode MonthlyCostShareRateCode,@SOCBalance SOCBalance,@CDTotalPaid CDTotalPaid, 
     @CDTotalSOC CDTotalSOC,@PROC_USER PROC_USER,@CostShareClaimID CostShareClaimID, @AdjudicatedCostShareAmtApplied AdjudicatedCostShareAmtApplied, 
     @PrevSOCAmt PrevSOCAmt,@totalpaid totalpaid,@Message [Message],@getdate [getdate],@IHCMFPcutoff IHCMFPcutoff 
FOR XML PATH('VAR'), ROOT('TESTTABLE'), ELEMENTS XSINIL 

和XML:

<TESTTABLE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <VAR> 
    <ClaimID>SOMECLAIMID</ClaimID> 
    <CoreClaimTotalPaid xsi:nil="true" /> 
    <ClaimTotalAmt xsi:nil="true" /> 
    <MemID xsi:nil="true" /> 
    <CLMStartDate xsi:nil="true" /> 
    <CLMEndDate xsi:nil="true" /> 
    <MonthlyCostShareID xsi:nil="true" /> 
    <MonthlyCostShareIDRollback xsi:nil="true" /> 
    <MonthlyCostShareAmt xsi:nil="true" /> 
    <MonthlyShareAmtUsed xsi:nil="true" /> 
    <MonthlyCostShareRateCode xsi:nil="true" /> 
    <SOCBalance xsi:nil="true" /> 
    <CDTotalPaid xsi:nil="true" /> 
    <CDTotalSOC xsi:nil="true" /> 
    <PROC_USER xsi:nil="true" /> 
    <CostShareClaimID xsi:nil="true" /> 
    <AdjudicatedCostShareAmtApplied xsi:nil="true" /> 
    <PrevSOCAmt xsi:nil="true" /> 
    <totalpaid xsi:nil="true" /> 
    <Message xsi:nil="true" /> 
    <getdate xsi:nil="true" /> 
    <IHCMFPcutoff xsi:nil="true" /> 
    </VAR> 
</TESTTABLE>