Sql server 创建循环以一般方式返回键值对XML元素
如何在标量值函数中创建一个循环,以通用方式返回键值对XML元素 我的函数当前如下所示:Sql server 创建循环以一般方式返回键值对XML元素,sql-server,xml,tsql,export,Sql Server,Xml,Tsql,Export,如何在标量值函数中创建一个循环,以通用方式返回键值对XML元素 我的函数当前如下所示: ALTER FUNCTION [dbo].[GetCustomXML] ( @Id UNIQUEIDENTIFIER ) RETURNS XML AS BEGIN RETURN ( SELECT ( SELECT --Table A (SELECT [DataItemName] = CASE WHEN [TableA].[Address] IS NOT NULL
ALTER FUNCTION [dbo].[GetCustomXML]
(
@Id UNIQUEIDENTIFIER
)
RETURNS XML
AS
BEGIN
RETURN (
SELECT (
SELECT
--Table A
(SELECT [DataItemName] = CASE WHEN [TableA].[Address] IS NOT NULL THEN 'Address' END,
[DataItemValue] = [TableA].[Address]
FOR XML PATH(''), ROOT('CUSTOM_DATA_ITEM'), TYPE),
--Table B
(SELECT [DataItemName] = CASE WHEN [TableB].[Name] IS NOT NULL THEN 'Name' END,
[DataItemValue] = [TableB].[Name]
FOR XML PATH(''), ROOT('CUSTOM_DATA_ITEM'), TYPE),
....
FROM [TableA] LEFT JOIN
[TableB] ON [TableA].[ID] = [TableB].[ID]
FOR XML PATH('OTHER'), ROOT('EXTENSION'), TYPE );
END;
正如你所看到的,我必须特别写下每个变量的路径。我想要一个循环,我只需要写一次就可以输入每个变量的路径
这是我想要的结果:
<OTHER>
<EXTENSION>
<CUSTOM_DATA_ITEM>
<DataItemName>Address</DataItemName> (variable name)
<DataItemValue>12800 Apple Dr. Houston TX, 77483</DataItemValue> (value inside table column)
</CUSTOM_DATA_ITEM>
<CUSTOM_DATA_ITEM>
<DataItemName>Name</DataItemName>
<DataItemValue>David</DataItemValue>
</CUSTOM_DATA_ITEM>
</OTHER>
</EXTENSION>
地址(变量名)
12800苹果休斯顿博士,77483(表列内数值)
名称
大卫
根据您的问题,我认为您正在寻找通用方法来实现所需的功能,这个问题并不十分清楚
这就是我在最后一个问题中告诉你的方法:
试验台
CREATE TABLE Test1(ID INT, TestVarchar VARCHAR(100),TestDate DATE);
INSERT INTO Test1 VALUES
(1,'Test 1',{d'2016-01-01'})
,(2,'Test 2',{d'2016-02-02'});
我从你的函数中得到,你想要一行
但这种方法也适用于许多行
SELECT 'ID' AS [CUSTOM_DATA_ITEM/DataItemName]
,ID AS [CUSTOM_DATA_ITEM/DataItemValue]
,''
,'TestVarchar' AS [CUSTOM_DATA_ITEM/DataItemName]
,TestVarchar AS [CUSTOM_DATA_ITEM/DataItemValue]
,''
,'TestDate' AS [CUSTOM_DATA_ITEM/DataItemName]
,TestDate AS [CUSTOM_DATA_ITEM/DataItemValue]
FROM Test1
WHERE ID=2
FOR XML PATH('EXTENSION'),ROOT('OTHER');
GO
结果
<OTHER>
<EXTENSION>
<CUSTOM_DATA_ITEM>
<DataItemName>ID</DataItemName>
<DataItemValue>2</DataItemValue>
</CUSTOM_DATA_ITEM>
<CUSTOM_DATA_ITEM>
<DataItemName>TestVarchar</DataItemName>
<DataItemValue>Test 2</DataItemValue>
</CUSTOM_DATA_ITEM>
<CUSTOM_DATA_ITEM>
<DataItemName>TestDate</DataItemName>
<DataItemValue>2016-02-02</DataItemValue>
</CUSTOM_DATA_ITEM>
</EXTENSION>
</OTHER>
--现在我们从上面创建一个字符串语句
--并执行它
EXEC (@cmd);
GO
--清理
由于命令与之前相同,因此结果也是…从您的问题来看,我认为您正在寻找通用方法来实现您的需求,这一点并不十分清楚 这就是我在最后一个问题中告诉你的方法: 试验台
CREATE TABLE Test1(ID INT, TestVarchar VARCHAR(100),TestDate DATE);
INSERT INTO Test1 VALUES
(1,'Test 1',{d'2016-01-01'})
,(2,'Test 2',{d'2016-02-02'});
我从你的函数中得到,你想要一行
但这种方法也适用于许多行
SELECT 'ID' AS [CUSTOM_DATA_ITEM/DataItemName]
,ID AS [CUSTOM_DATA_ITEM/DataItemValue]
,''
,'TestVarchar' AS [CUSTOM_DATA_ITEM/DataItemName]
,TestVarchar AS [CUSTOM_DATA_ITEM/DataItemValue]
,''
,'TestDate' AS [CUSTOM_DATA_ITEM/DataItemName]
,TestDate AS [CUSTOM_DATA_ITEM/DataItemValue]
FROM Test1
WHERE ID=2
FOR XML PATH('EXTENSION'),ROOT('OTHER');
GO
结果
<OTHER>
<EXTENSION>
<CUSTOM_DATA_ITEM>
<DataItemName>ID</DataItemName>
<DataItemValue>2</DataItemValue>
</CUSTOM_DATA_ITEM>
<CUSTOM_DATA_ITEM>
<DataItemName>TestVarchar</DataItemName>
<DataItemValue>Test 2</DataItemValue>
</CUSTOM_DATA_ITEM>
<CUSTOM_DATA_ITEM>
<DataItemName>TestDate</DataItemName>
<DataItemValue>2016-02-02</DataItemValue>
</CUSTOM_DATA_ITEM>
</EXTENSION>
</OTHER>
--现在我们从上面创建一个字符串语句
--并执行它
EXEC (@cmd);
GO
--清理
由于命令与之前相同,因此结果也是…请提供一些与所需输出相关的示例数据。谢谢@Matt我已编辑了此问题。我的期望输出在底部。期望输出比以前更清晰一些,但我理解这一部分。我要求输入/示例数据,以查看您希望如何转换数据,因为您所显示的内容可能会根据您的输入数据以不同的更有效的方式完成。输入数据是通过UI获得的,并存储在相应的表/列中。例如,有一个名为Name的字段,用户将其名称输入。从那里我把它从柱子上拉下来。我不确定如何显示示例数据。这就是你说的吗@Matt@Matt由于某些要求,我提供的名称值格式无法更改。请提供一些与所需输出相关的示例数据。谢谢@Matt我编辑了此问题。我的期望输出在底部。期望输出比以前更清晰一些,但我理解这一部分。我要求输入/示例数据,以查看您希望如何转换数据,因为您所显示的内容可能会根据您的输入数据以不同的更有效的方式完成。输入数据是通过UI获得的,并存储在相应的表/列中。例如,有一个名为Name的字段,用户将其名称输入。从那里我把它从柱子上拉下来。我不确定如何显示示例数据。这就是你说的吗@Matt@Matt由于某些要求,我提供的名称-值格式无法更改。这是非常好的信息。我必须阅读更多关于动态sql以及标量函数和非标量函数之间的差异的内容。感谢@shnugot的帮助,这是一个很好的信息。我必须阅读更多关于动态sql以及标量函数和非标量函数之间的差异的内容。谢谢你的帮助@Shnugo