Sql server 2008 对于没有来自的XML

Sql server 2008 对于没有来自的XML,sql-server-2008,tsql,Sql Server 2008,Tsql,我继承了一个1500行的存储过程,它声明了大量变量,这些变量在过程的整个生命周期中经常改变状态。我们有一个逻辑错误,它被证明是极难跟踪的,因此我们的任务是在有限的时间内将变量写入日志表。我的解决方案是将每个变量都放入XML中,并将它们记录在一个没有索引的表中,以便在写入过程中尽可能快地完成。这是一个最后的手段,但我们有一百万美元的谨慎骑在一个解决方案,而不是很多时间去挖掘 因此,在我们运行过程的一周内,解决方案将是这样的: 过程将数据声明并初始化为变量 函数被调用以记录状态 这个过程会进行更多

我继承了一个1500行的存储过程,它声明了大量变量,这些变量在过程的整个生命周期中经常改变状态。我们有一个逻辑错误,它被证明是极难跟踪的,因此我们的任务是在有限的时间内将变量写入日志表。我的解决方案是将每个变量都放入XML中,并将它们记录在一个没有索引的表中,以便在写入过程中尽可能快地完成。这是一个最后的手段,但我们有一百万美元的谨慎骑在一个解决方案,而不是很多时间去挖掘

因此,在我们运行过程的一周内,解决方案将是这样的:

  • 过程将数据声明并初始化为变量
  • 函数被调用以记录状态
  • 这个过程会进行更多的代码更改状态
  • 函数被调用以记录状态
  • 程序做的更多
  • 函数被调用以记录状态
我的问题是

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')

虽然只要所选变量具有别名,就可以跳过子查询,但这样做很好。另外,考虑如何使用ISNULL函数来表示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>
以及XML:


索姆克莱米德

我没有把它放在我的示例中,但我将添加元素XSINIL,它将只保留空值。我不太担心初始化,就像您在示例中所做的那样。但我应该说明。感谢您的快速回复!事实上,这确实回答了我的问题。刚刚尝试了@outputxml变量的一个变体。非常感谢你!
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
<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>