0

私は 1500 行のストアド プロシージャを継承しました。このストアド プロシージャは、プロシージャの存続期間中に頻繁に状態を変更する無数の変​​数を宣言します。追跡が非常に困難であることが判明した論理エラーがあり、そのため、ログテーブルに有限時間変数を書き込むように依頼されました。私の解決策は、各変数を取得してXMLに詰め込み、インデックスなしでテーブルに記録して、書き込み中に可能な限り高速にすることです。これは少し最後の手段ですが、これに対する解決策には数百万ドルの不一致があり、掘り下げる時間はあまりありません。

したがって、解決策は、proc を実行する 1 週間の間、次のようになります。

  • 手順 データを変数に宣言して初期化します。
  • 状態を記録するために関数が呼び出されます
  • 手順は、状態を変更するより多くのコードを実行します
  • 状態を記録するために関数が呼び出されます
  • 手順はさらに多くのことを行います。
  • 状態を記録するために関数が呼び出されます。

私の質問はこれです。

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 に答える