2013-04-20 187 views
1

是否有任何方法在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

回答

2

你可以使用光標:

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

1

你可以試試這個:

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

0

如果你需要的是數據的垂直格式,那麼我還是推薦在打印使用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