在SQL Server中处理查询结果

问题描述:

是否有任何方法在SQL Server中执行查询,然后打印包含来自查询结果的数据的消息。在SQL Server中处理查询结果

举例来说,如果我有这样的查询:

SELECT ID, FirstName, LastName FROM Customers 

我想用这样的遵循它,对结果的每一行。

Print N'Customer ID: ' + [ID] 
Print N'First Name: ' + [FirstName] 
Print N'Last Name: ' + [LastName] 

我知道我可以使用AS子句每一列的格式,但数据总是在一个表进行格式化。有没有什么方法可以对结果进行不同的格式化,而无需使用其他语言来处理结果?

+0

你可以把它当作XML。 – MarcinJuraszek 2013-04-20 15:11:49

+0

你为什么要这样做? PRINT输出对于客户端应用程序消耗和减慢很困难。 – RBarryYoung 2013-04-20 15:13:08

+0

@RBarryYoung:我已经开发了26年的软件,并且很好地掌握了解析文本输出的难度。在这种情况下,我将简单地复制输出并将其粘贴到电子邮件中。我清楚我需要什么。但是,我的大部分专业知识不在SQL Server中。我可以轻松地在C#中创建一些东西,但如果SQL Server能够在简单的查询中处理这个有点琐碎的任务,那将会非常方便。 – 2013-04-20 15:18:01

你可以使用光标:

declare @curse cursor 
set @curse = cursor fast_forward for 
select ID, FirstName, LastName 
from Customers 

declare @id int, 
     @firstName varchar(32), 
     @lastName varchar(32) 

open @curse 

fetch next from @curse into @id, @firstName, @lastName 

while (@@fetch_status = 0) 
begin 
    Print N'Customer ID: ' + @id 
    Print N'First Name: ' + @firstName 
    Print N'Last Name: ' + @lastName 

    fetch next from @curse into @id, @firstName, @lastName 
end 

close @curse 

或者你可以做到这一点没有:

select 'Customer ID: ' + cast(ID as varchar(32)) + char(13) + char(10) + 
     'First Name: ' + FirstName + char(13) + char(10) + 
     'Last Name: ' + LastName + char(13) + char(10) 
from Customers 

使用Ctrl + T改变你的输出如果您使用第二种方法,则从网格到文本模式的SSMS。

+0

有趣。对游标不太熟悉,但似乎正是我所需要的。 – 2013-04-20 15:25:25

+0

@muhmud只是一个注释,我不得不对'@ curse'微笑,因为这真的可能是一个诅咒:) – YvesR 2013-04-20 15:29:31

+0

非常真实:)因此,我也添加了一个无游标的方式。 – muhmud 2013-04-20 15:32:16

你可以试试这个:

DECLARE @customerid varchar(100); 
DECLARE @firstname varchar(100); 
DECLARE @@lastname varchar(100); 

SELECT @customerid=ID, @firstname=FirstName, @lastname=LastName 
FROM Customers 

Print N'Customer ID: ' + @customerid 
Print N'First Name: ' + @firstname 
Print N'Last Name: ' + @lastname 
+0

谢谢。我是否正确,在查询返回多个结果的情况下,只打印最后一个结果? – 2013-04-20 15:21:32

+0

是的,在这种情况下,只有最后一个var变得过分纠缠。 – YvesR 2013-04-20 15:22:24

+0

如果您需要在多行上执行此操作,则需要一个游标并为每行执行此操作 – YvesR 2013-04-20 15:24:08

如果你需要的是数据的垂直格式,那么我还是推荐在打印使用SELECT:

SELECT Lbl, Txt 
FROM (
       SELECT ID, 'Customer ID:' As Lbl, CAST(ID As VARCHAR(50)) As Txt  FROM Customers 
    UNION ALL SELECT ID, 'First Name:' As Lbl, CAST(FirstName As VARCHAR(50)) As Txt FROM Customers 
    UNION ALL SELECT ID, 'Last Name:' As Lbl, CAST(FirstName As VARCHAR(50)) As Txt FROM Customers 
    ) A 
ORDER BY ID, Lbl