2

これは私が現在使用しているクエリです:

DECLARE @Index AS INT
SET @Index = 1
SELECT
  auditId,
  parameters.value('(params/param[position()=sql:variable("@Index")]/node())[1]', 'nvarchar(256)') AS value,
  parameters.value('(params/param[position()=sql:variable("@Index")]/@entityId)[1]', 'nvarchar(256)') AS entityId,
  parameters.value('(params/param[position()=sql:variable("@Index")]/@entityType)[1]', 'bigint') AS entityType,
  parameters.value('(params/param[position()=sql:variable("@Index")]/@localizable)[1]', 'bit') AS localizable
FROM
  audit

監査テーブルに、次のようなパラメーターXMLノードが含まれている場合:UserName ComputerName

冗長なセクションを取り除き、parameters.value('(params/param[position()=sql:variable("@Index")]おそらくそれを結合として行う方法があるかどうか疑問に思っていますか?

4

1 に答える 1

3

を使用すると、少し簡略化できますcross apply

SELECT
  auditId,
  T.N.value('.', 'nvarchar(256)') AS value,
  T.N.value('@entityId', 'nvarchar(256)') AS entityId,
  T.N.value('@entityType', 'bigint') AS entityType,
  T.N.value('@localizable', 'bit') AS localizable
FROM audit
  CROSS APPLY parameters.nodes('/params/param[sql:variable("@Index")]') AS T(N)
于 2012-08-07T13:38:27.347 に答える