我有这个 tSQL 代码可以正常工作:
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)
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够做的是传入许多对值的动态列表,这些值对在每个值之间进行 OR 运算,即
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)
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
任何需要变量列表或数组的参数可能都是用户定义表类型的良好候选者。我将创建类型为:
CREATE TYPE [PropertyVariableTableType] AS TABLE (
PropertyName nvarchar(255),
PropertyValue nvarchar(255) )
Run Code Online (Sandbox Code Playgroud)
表类型可以用作存储过程的参数,就像任何其他类型一样。然后,您可以联接用户定义的表或迭代行以动态构建查询。