Variable pour le nom de l'élément

9

J'ai ce code tSQL qui fonctionne bien:

SELECT 
c.logguid,
a.b.value('./PropertyValue', 'varchar(max)') asd
  FROM [dnn].[dbo].[EventLog2] c

cross apply sss.nodes('/LogProperties/LogProperty[PropertyName=sql:variable("@x") and PropertyValue=sql:variable("@y")]') as a(b)

Cependant, ce que je veux pouvoir faire, c'est passer dans une liste dynamique de plusieurs paires de valeurs qui sont OU entre chacune, c'est-à-dire

SELECT 
c.logguid,
a.b.value('./PropertyValue', 'varchar(max)') asd
  FROM [dnn].[dbo].[EventLog2] c

cross apply sss.nodes(
'/LogProperties/LogProperty[PropertyName=sql:variable("@x") and PropertyValue=sql:variable("@y")
or
PropertyName=sql:variable("@a") and PropertyValue=sql:variable("@b")
]'
) as a(b)

Y-a-t'il une façon de le faire?

Ross Buggins
la source
1
Pour être sûr de bien comprendre, il pourrait également y avoir @c et @d, etc.?
wtjones

Réponses:

2

Tout paramètre nécessitant une liste ou un tableau de variables est probablement un bon candidat pour un type de table défini par l'utilisateur. Je créerais le type comme:

CREATE TYPE [PropertyVariableTableType] AS TABLE (
    PropertyName nvarchar(255),
    PropertyValue nvarchar(255) )

Les types de table peuvent être utilisés comme paramètres de procédures stockées comme tout autre type. Vous pouvez ensuite soit vous joindre à la table définie par l'utilisateur, soit itérer les lignes pour créer dynamiquement la requête.

dartonw
la source