Sql server 从Sql Server语句的默认输出中删除根XML节点

Sql server 从Sql Server语句的默认输出中删除根XML节点,sql-server,xml,Sql Server,Xml,我希望@MyActualXMLOut看起来像@MyDesiredXMLOut。。。怎样提前谢谢 @MyDesiredXMLOut= <MyRequiredRoot> <Property1>Value1</Property1> <Property2>Value2</Property2> </MyRequiredRoot> @MyActualXMLOut <_x0040_MyTableVar> <

我希望@MyActualXMLOut看起来像@MyDesiredXMLOut。。。怎样提前谢谢

@MyDesiredXMLOut=

<MyRequiredRoot>
  <Property1>Value1</Property1>
  <Property2>Value2</Property2>
</MyRequiredRoot>
@MyActualXMLOut

<_x0040_MyTableVar>
  <MyXML>
    <MyRequiredRoot>
      <Property1>Value1</Property1>
      <Property2>Value2</Property2>
    </MyRequiredRoot>
  </MyXML>
</_x0040_MyTableVar>
下面的代码可以按原样运行

DECLARE @MyDesiredXMLOut XML;
DECLARE @MyActualXMLOut XML;

SELECT @MyDesiredXMLOut =
   CONVERT( XML, 
   '<MyRequiredRoot><Property1>Value1</Property1>
      <Property2>Value2</Property2>
    </MyRequiredRoot>' );

DECLARE @MyTableVar table( ID int NOT NULL, MyXML XML NOT NULL );

INSERT INTO @MyTableVar VALUES( 1, @MyDesiredXMLOut )

SELECT @MyActualXMLOut = 
    ( SELECT MyXML
      FROM   @MyTableVar
      WHERE  ID = 1
      FOR XML AUTO )

SELECT @MyDesiredXMLOut;

SELECT @MyActualXMLOut;
您可以使用查询“/”

您可以使用查询“/”

FOR XML AUTO正在尝试添加有关表名的信息,该表名可能包含无效的XML元素名字符及其来源的列名

改变

SELECT @MyActualXMLOut = 
    ( SELECT MyXML
      FROM   @MyTableVar
      WHERE  ID = 1
      FOR XML AUTO )

说明:由于“*”告诉SQL Server您只需要直接获取列值,因此不要将列名用作标记名;FOR XML PATH表示您不想在输出周围添加任何额外的根节点,只需按原样使用。

FOR XML AUTO正在尝试添加有关表名的信息,该表名可能包含无效的XML元素名字符及其来源的列名

改变

SELECT @MyActualXMLOut = 
    ( SELECT MyXML
      FROM   @MyTableVar
      WHERE  ID = 1
      FOR XML AUTO )


说明:由于“*”告诉SQL Server您只需要直接获取列值,因此不要将列名用作标记名;FOR XML PATH表示您不想在输出周围添加任何额外的根节点,只需按原样使用即可。

我不知道这是否是真实的示例,但是:

表中的值已经是XML

不管怎样,都不要使用XML自动模式,正如所指出的那样,应该选择以下路径:

甚至更简单

SELECT @MyActualXMLOut = MyXML
FROM   @MyTableVar
WHERE  ID = 1;

我不知道这是否是真实的例子,但是:

表中的值已经是XML

不管怎样,都不要使用XML自动模式,正如所指出的那样,应该选择以下路径:

甚至更简单

SELECT @MyActualXMLOut = MyXML
FROM   @MyTableVar
WHERE  ID = 1;

谢谢就这样!这是我发布的解决方案的一个替代方案,只是使用.query而不是“*”Jamie,@DanField,您正在告诉一个值,它已经是XML,要作为XML输出,然后使用query获取其XML。。。为什么?谢谢!就这样!这是我发布的解决方案的一个替代方案,只是使用.query而不是“*”Jamie,@DanField,您正在告诉一个值,它已经是XML,要作为XML输出,然后使用query获取其XML。。。为什么?这也是一个很好的方法。。也许这也是一个不太麻烦的方法。。我的部分假设是,可能有人希望从多行表变量中生成它,尽管实际情况是这样的。如果你只想要一行,那么这就足够了,应该是最有意义的了。@DanField,好吧,我明白你的意思了。。。WHERE ID=1听起来并不那么实际,但您是对的,在本例中,可以从表中的所有XML值创建多节点XML…因此,我的部分假设是,可能有人希望从表变量的多行中生成此值,即使实际情况是这样的。如果你只想要一行,那么这就足够了,应该是最有意义的了。@DanField,好吧,我明白你的意思了。。。WHERE ID=1听起来并不是那么实际,但您是对的,在本例中,可以从表中的所有XML值创建多节点XML。。。
SELECT @MyActualXMLOut = MyXML
FROM   @MyTableVar
WHERE  ID = 1;