2012-06-08 60 views
0

可能重複:
How Can i display the output of SQL 「PRINT」 Command in C#?捕獲MS SQL輸出

我有通過經由PRINT命令輸出它產生另一個SQL語句的SQL語句。現在我必須在SQL編輯器中手動運行它,複製結果字符串查詢並在不同的窗口中運行該查詢。

我想使用.NET控制檯應用程序實現自動化。是否有可能在.NET中捕獲PRINT語句輸出?是否有另一種方法來捕獲SQL PRINT輸出?

回答

1

而不是

Print @sql 

做一個

Select @sql 

捕捉它,你想怎麼(ADO,LINQ2SQL,EF),然後正常運行的說法。通過以記錄集的形式返回sql,您可以依靠任何框架處理數據的正常方式,而不是嘗試執行某些不是旨在實際返回數據的事情(您的sql實際上是返回數據)。

你甚至可以跳過這一步,如果你想和做

EXEC sp_executesql @sql 

繞過整個往返。 EXECsp_ExecuteSql文件。

+0

如果我必須使用Print語句會怎麼樣?我不只是從表中選擇,而且還會輸出創建另一個SQL查詢的字符串。 –

+0

如果你需要,那麼我感到很抱歉,你在那個位置。我沒有經驗(也不希望)從打印語句中提取數據。 –

+0

確實很傷心 –

0

如果您正在使用SQL Server/oracle您可以執行動態SQL很容易

對於SQL Server,你可以使用EXEC或如果您使用的是Oracle對sp_executesql

DECLARE @sqlCommand varchar(1000) 
SET @sqlCommand = 'SELECT * FROM SOME_TABLE' 
--Use Exec 
EXEC (@sqlCommand) 
--or you can use the sp_executesql 
EXECUTE sp_executesql @sqlCommand 

,那麼你就需要使用EXECUTE IMMEDIATE

2

當我來到這裏尋找你的直接問題的答案,那就是「如何捕獲打印命令的輸出」,我想擴展先前的答案。

如果您正在使用多個打印語句可以 串聯一組命令

SET @sqlCommand = @sqlCommand + @newPart; 

這是不幸的,但有時我遇到的問題,因爲SQLSERVER認爲我已經超出了最大規模的作品建立一個SQL命令對於@sqlCommand,當我沒有。我解決這個問題通過分別持有件,我經常需要在同一塊varations無論如何,然後將它們連接在這樣的exec命令:

EXEC ( 
'MERGE ' + @targetTable + ' t ' + 
'USING ' + @sourceTable + ' s ' + 
'ON ' + @keycondition + ' ' + 
'WHEN MATCHED AND ' + @updateCondition + ' THEN ' + 
    'UPDATE SET ' + @updateColumns + ' ' + 
'WHEN NOT MATCHED BY TARGET THEN ' + 
    'INSERT (' + @insertTargetColumns + ') ' + 
    'VALUES (' + @insertSourceColumns + ') ' + 
'WHEN NOT MATCHED BY SOURCE THEN ' 
    'UPDATE SET deleteFlag = ''D'', updDtTm = GETDATE()' 
) 

希望這有助於。我正在從快照轉移到增量更新,所以sourceTable中有deleteFlag,我不使用最後一個子句。