如何编写此SQL while循环代码,以在一行而不是三行中获得XML结果?
我试图在一行中得到所有这些XML结果,而不是每列3行如何编写此SQL while循环代码,以在一行而不是三行中获得XML结果?,sql,sql-server,xml,tsql,sql-server-2014,Sql,Sql Server,Xml,Tsql,Sql Server 2014,我试图在一行中得到所有这些XML结果,而不是每列3行 DECLARE @ii INT = 10; DECLARE @String1 NVARCHAR(4000); SET @String1 = ''; WHILE(@ii <= 18) BEGIN SET @String1 = (@String1 + 'SELECT LoanNumber = ''Complaint'+CONVERT(VARCHAR(2),@ii)+'-Call1'' , LoanStatus=''Complia
DECLARE @ii INT = 10;
DECLARE @String1 NVARCHAR(4000);
SET @String1 = '';
WHILE(@ii <= 18)
BEGIN
SET @String1 = (@String1 + 'SELECT LoanNumber = ''Complaint'+CONVERT(VARCHAR(2),@ii)+'-Call1'' , LoanStatus=''Compliants'' , LoanStatusDate = CAST(GETDATE() AS DATE)
UNION
SELECT LoanNumber = ''Complaint'+CONVERT(VARCHAR(2),@ii)+'-Call2'', LoanStatus=''Compliants'' , LoanStatusDate = CAST(GETDATE() AS DATE)
UNION
SELECT LoanNumber = ''Complaint'+CONVERT(VARCHAR(2),@ii)+'-Call3'', LoanStatus=''Compliants'' , LoanStatusDate = CAST(GETDATE() AS DATE)')
IF @ii != 18
SET @string1 = @string1 + ' UNION '
ELSE
SET @string1 = @string1 + 'FOR XML PATH (''Loan''),ROOT(''Loans'') '
SET @ii = @ii+1
END
EXEC sp_executesql @String1
DECLARE@ii INT=10;
声明@String1 NVARCHAR(4000);
设置@String1='';
虽然(@ii这可能是胡乱猜测,但我感觉,我理解,这是关于什么:
如果您运行代码,您将看到结果。不需要输入数据。
我只希望xml结果的结构都在一行上
每个回路一套
您提供的代码导致以下情况:
<Loans>
<Loan>
<LoanNumber>Complaint10-Call1</LoanNumber>
<LoanStatus>Compliants</LoanStatus>
<LoanStatusDate>2019-01-22</LoanStatusDate>
</Loan>
<Loan>
<LoanNumber>Complaint10-Call2</LoanNumber>
<LoanStatus>Compliants</LoanStatus>
<LoanStatusDate>2019-01-22</LoanStatusDate>
</Loan>
<!-- more of them-->
</Loans>
结果是一行:
什么版本的SQL?我猜是SQL Server,对吗?另外,你能提供一些示例输入数据吗?@shawn SQL Server 2014。如果你运行代码,你会看到结果。不需要输入数据。我只希望xml结果的结构对于每个循环的一组都在一行上。是的,我只是想找出实际的应用程序我不确定您的示例是否复制了您最终想要执行的操作的实际应用程序。这实际上是生成了3个重复行,但只是更改了一个调用#。如果您实际查询调用,您将不需要循环。您的查询将处理它。如果您需要使用循环,您可以使用另一个内部循环,但您仍在对行应用Call1、Call2和Call3。Mozee,您提供的“XML”是“我想要这样的东西…而不是结果…”是绝对无效的XML。您确定需要这样做吗?很可能,您不需要WHILE
循环,也不需要动态XML…请尝试使用最少的样本数据和预期的输出来设置循环。@Mozee您不需要SQL中的循环,也不需要循环来处理XML。您的代码看起来像是在尝试生成18个数字递增的XML元素。您不需要循环,只需要一个值从1到18的表(表变量、临时表、CTE、数字表或FRROM中的行构造函数)和一个简单的XML
查询。
<Loans>
<Loan>
<LoanNumber>Complaint10-Call1</LoanNumber>
<LoanStatus>Compliants</LoanStatus>
<LoanStatusDate>2019-01-22</LoanStatusDate>
</Loan>
<Loan>
<LoanNumber>Complaint10-Call2</LoanNumber>
<LoanStatus>Compliants</LoanStatus>
<LoanStatusDate>2019-01-22</LoanStatusDate>
</Loan>
<!-- more of them-->
</Loans>
<Loans>
<Loan>
<LoanNumber>Complaint10-Call1</LoanNumber><LoanStatus>Compliants</LoanStatus><LoanStatusDate>2019-01-22</LoanStatusDate>
</Loan>
<!-- more of them-->
</Loans>
DECLARE @xmltable table(SomeXml XML)
INSERT INTO @xmltable VALUES
--the whole in one line
('<root><a>test</a><a>test2</a></root>')
--all <a>s in one line
,('<root>
<a>test</a><a>test2</a>
</root>')
--each element in one line
,('<root>
<a>test</a>
<a>test2</a>
</root>')
--white space going wild...
,('<root>
<a>test</a>
<a>test2</a>
</root>');
--now check the results
SELECT * FROM @xmltable;
DECLARE @somedata table(SomeValue VARCHAR(100),SomeStatus VARCHAR(100),SomeDate DATE);
INSERT INTO @somedata VALUES
('Complaint10-Call1','Complaints','2019-01-22')
,('Complaint10-Call2','Complaints','2019-01-22')
,('Complaint10-Call3','Complaints','2019-01-22');
SELECT * FROM @somedata FOR JSON PATH;
[{"SomeValue":"Complaint10-Call1","SomeStatus":"Complaints","SomeDate":"2019-01-22"},{"SomeValue":"Complaint10-Call2","SomeStatus":"Complaints","SomeDate":"2019-01-22"},{"SomeValue":"Complaint10-Call3","SomeStatus":"Complaints","SomeDate":"2019-01-22"}]