2012-06-08 65 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,我不使用最后一个子句。