2012-08-07 51 views
2

這是我目前使用的查詢:我可以清理這個XML查詢嗎?

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節點: 用戶名 計算機名

我想知道是否有是擺脫多餘的parameters.value('(params/param[position()=sql:variable("@Index")]部分的一種方式,也許這是一個加入?

+2

讓我們等待Mikael Eriksson。他是那種東西上的神 – 2012-08-07 13:22:09

回答

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)