Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQLSERVER FOR XML路径-将属性名称视为变量_Sql Server_Xml_Tsql - Fatal编程技术网

Sql server SQLSERVER FOR XML路径-将属性名称视为变量

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将使用它作为命令,将字段的值放入属性中,而不是元素中 此外,此查询用作子查询,因

我需要用xml塑造这个查询的结果,但是字段的别名@q1_12应该根据不同和复杂的条件而改变

那么,是否可以将此属性的名称放在变量中,并像动态sql一样在查询中使用它 有什么诀窍或解决办法吗

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>');