Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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-OPENXML如何获取属性值_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

SQL Server-OPENXML如何获取属性值

SQL Server-OPENXML如何获取属性值,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有以下XML: <Field FieldRowId="1000"> <Items> <Item Name="CODE"/> <Item Name="DATE"/> </Items> </Field> 编辑:我在xml中添加了一个根节点。并演示了如何获取ID。我假设xml中有多个字段元素。这是假设您拥有起始XML;您是否有物品需要向上移动 DECLARE @T varchar

我有以下XML:

<Field FieldRowId="1000">
    <Items>
        <Item Name="CODE"/>
        <Item Name="DATE"/>
    </Items>
</Field>

编辑:我在xml中添加了一个根节点。并演示了如何获取ID。我假设xml中有多个字段元素。这是假设您拥有起始XML;您是否有物品需要向上移动

DECLARE @T varchar(max) 
SET @T = 
'<root>
    <Field FieldRowId="1000">
        <Items>
            <Item Name="CODE"/>
            <Item Name="DATE"/>
        </Items>
    </Field>
    <Field FieldRowId="2000">
        <Items>
            <Item Name="CODE"/>
            <Item Name="DATE"/>
        </Items>
    </Field>
</root>'

DECLARE @X xml

SET @X = CAST(@T as xml)
SELECT Y.ID.value('../../@FieldRowId', 'int') as FieldID, 
       Y.ID.value('@Name', 'varchar(max)') as "Name"
FROM @X.nodes('/root/Field/Items/Item') as Y(ID)
DECLARE@T varchar(最大值)
设置@T=
'
'
声明@X xml
设置@X=CAST(@T为xml)
选择Y.ID.value('../../@FieldRowId',int')作为FieldID,
Y.ID.value(“@Name”,“varchar(max)”作为“Name”
从@X.nodes('/root/Field/Items/Item')作为Y(ID)

使用节点是一种方法
OPENXML
每次使用时占用SQL server内存的1/8。尽管
OPENXML
和节点通常具有相同的查询性能

如标记中所述,您使用的是SQL Server 2005,它本机支持XML数据类型。为什么不使用它呢?由于应用程序中数据层的限制,SP不能使用xml数据类型输入参数。有没有一种方法可以保留VARCHAR(MAX)input参数并以某种方式将其转换为XML数据类型?因此,如果我有了XML变量,我该如何实现我想要实现的目标?您可以直接使用它,就像潜行者所展示的那样,也可以像我所说的那样使用OPENXML。
DECLARE @T varchar(max) 
SET @T = 
'<root>
    <Field FieldRowId="1000">
        <Items>
            <Item Name="CODE"/>
            <Item Name="DATE"/>
        </Items>
    </Field>
    <Field FieldRowId="2000">
        <Items>
            <Item Name="CODE"/>
            <Item Name="DATE"/>
        </Items>
    </Field>
</root>'

DECLARE @X xml

SET @X = CAST(@T as xml)
SELECT Y.ID.value('../../@FieldRowId', 'int') as FieldID, 
       Y.ID.value('@Name', 'varchar(max)') as "Name"
FROM @X.nodes('/root/Field/Items/Item') as Y(ID)