0

我继承了一个 1500 行的存储过程,它声明了无数变量,这些变量在整个过程的生命周期中经常改变状态。我们有一个逻辑错误已被证明极难追踪,因此我们的任务是在有限的时间内将变量写入日志表。我的解决方案是获取每个变量并将它们填充到 XML 中,并将它们记录在没有索引的表中,以便在写入过程中尽可能快。这是最后的手段,但我们有一百万美元的差异依赖于解决这个问题,而且没有太多时间去挖掘。

因此,在我们运行 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')
4

2 回答 2

1

这样就可以了,尽管只要选择的变量具有别名,您就可以跳过子查询。此外,请考虑如何使用 isnull 函数在 xml 中表示 null 参数值。

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

于 2013-07-01T17:13:34.433 回答
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>
于 2013-07-01T17:47:14.010 回答