Sql server SQLSERVER FOR XML路径-将属性名称视为变量
我需要用xml塑造这个查询的结果,但是字段的别名@q1_12应该根据不同和复杂的条件而改变 那么,是否可以将此属性的名称放在变量中,并像动态sql一样在查询中使用它 有什么诀窍或解决办法吗Sql server SQLSERVER FOR XML路径-将属性名称视为变量,sql-server,xml,tsql,Sql Server,Xml,Tsql,我需要用xml塑造这个查询的结果,但是字段的别名@q1_12应该根据不同和复杂的条件而改变 那么,是否可以将此属性的名称放在变量中,并像动态sql一样在查询中使用它 有什么诀窍或解决办法吗 SELECT field1 as "@q1_12" FROM table1 FOR XML PATH ('qt'),TYPE 我知道,这里的字符“@”会引起混淆,它有不同的含义,可以被视为变量,也可以被视为文本。在本例中,XML将使用它作为命令,将字段的值放入属性中,而不是元素中 此外,此查询用作子查询,因
SELECT field1 as "@q1_12"
FROM table1
FOR XML PATH ('qt'),TYPE
我知道,这里的字符“@”会引起混淆,它有不同的含义,可以被视为变量,也可以被视为文本。在本例中,XML将使用它作为命令,将字段的值放入属性中,而不是元素中
此外,此查询用作子查询,因此使用CASE/IF非常困难,有什么想法吗?唯一的方法是使用动态SQL。不能使用变量替换对象、别名等的值。因此,需要将其安全地注入语句: 声明@attributename sysname=N'@q1_12'; 声明@SQL nvarcharMAX; 将@SQL=N'选择字段1为'+QUOTENAME@attributename+NCHAR13+NCHAR10+ N'来自表1'+NCHAR13+NCHAR10+ N'对于XML路径'qt',TYPE;'; EXEC sp_executesql@SQL;
您的问题清楚地表明,您了解动态SQL,并且您得到了一些关于替换的提示,可以在字符串级别解决这个问题 建议1 但是可能有一种方法,特别是如果可能的名字都是已知的,而且名单也不是很大:
SELECT field1 as @attributename <-- this is a variable
FROM table1
FOR XML PATH ('qt'),TYPE
-如您所知,不可能使用变量列别名。。。
-您可以使用动态语句,但这涉及一些主要的回退。。。没有特别的,很难继续输出
-但是你可以试试这个
-要模拟复杂条件,我只需检查一个值,但您将得到ghist:
DECLARE @mockupTable TABLE(ID INT IDENTITY,SomeValue VARCHAR(100));
INSERT INTO @mockupTable VALUES('Row 1'),('Row 2');
背后的神奇之处:如果没有明确指定,那么使用FOR XML PATH创建的XML将忽略NULL值。
您可以声明所有可能的列名,如果未达到条件,则将省略所有列名
建议2
这是相反的方法:
DECLARE @SomeCondition INT=2;
SELECT CASE WHEN @SomeCondition=1 THEN SomeValue END AS [@q1_01]
,CASE WHEN @SomeCondition=2 THEN SomeValue END AS [@q1_02]
,CASE WHEN @SomeCondition=3 THEN SomeValue END AS [@q1_03]
--add all possible attribute names here...
FROM @mockupTable t
FOR XML PATH('qt'),TYPE;
XML将与所有属性并排创建,而XQuery将只返回我们想要保留的属性。您能使用数据中不会出现的属性名,然后用您想要的字符串替换该字符串吗?最简单的方法可能是只进行文本替换;既不是SQL也不是类似XML的动态结果集,如果这是更大查询的一部分,则也不能使用FLWOR查询来解决它。也就是说,选择CONVERTXML,将选择字段1替换为[@_DynamicAttribute]。。。对于XML路径'qt','u DynamicAttribute',@attributename。我们很仁慈地假设“dynamiccatribute”不会出现在源代码中。根据您的实际查询,将其拼接为子查询可能需要一些操作,但至少在名义上,您可以将类型化XML嵌入其他XML中。查询以XML类型返回数据,如您可以看到的XML路径“qt”,**类型**,因此,下一个问题是:是否可以在子查询中使用EXEC sp_executesql@SQL的结果?@alex否。正如@jeroenmoster所建议的,您需要使用替换方法。
DECLARE @KeepThis VARCHAR(100)='q1_02';
SELECT
(
SELECT SomeValue AS [@q1_01]
,SomeValue AS [@q1_02]
,SomeValue AS [@q1_03]
FROM @mockupTable t
FOR XML PATH('qt'),TYPE
).query('for $qt in /qt
return
<qt>
{
for $a in $qt/@*[local-name(.)=sql:variable("@KeepThis")]
return $a
}
</qt>');