2013-07-01 4 views
0

Я унаследовал 1500-строчную хранимую процедуру, которая объявляет множество переменных, которые часто меняют состояние на протяжении всего срока действия процедуры. У нас есть логическая ошибка, которая оказалась чрезвычайно трудной для отслеживания и как таковая была поставлена ​​задача записать переменные в течение конечного времени в таблицу журналов. Мое решение состоит в том, чтобы взять каждую из переменных и наполнить их в XML и записать их в таблицу без индексов, чтобы она была настолько быстрой, насколько возможно, во время записи. Это немного в последнюю очередь, но у нас есть расхождение на миллион долларов, преодолевающее это решение, и не так много времени, чтобы копать.FOR XML без FROM

Таким образом, решение будет что-то вроде этого в течение периода недели, когда мы бежим процедурный:

  • Процедура Объявляет и инициализирует данных в переменные.
  • Функция называется запись штатам
  • Процедура делает кучу более изменение кода состояния
  • функция вызывается для записи штатам
  • Процедура делает многое другое.
  • Функция вызывается для записи состояний.

Мой вопрос в том, что.

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

, который будет работать нормально, хотя вы можете пропустить подзапрос до тех пор, пока выбранные переменные имеют псевдонимы. Также рассмотрите, как вы хотите представить значения нулевого параметра в xml, используя функцию isnull.

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

я не ставил его в моем примере, но я буду лавировать на ЭЛЕМЕНТОВ 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>