我有一个 SQL 语句,它通过 PRINT 命令输出另一个 SQL 语句。现在我必须在 SQL 编辑器中手动运行它,复制生成的字符串查询并在不同的窗口中运行该查询。
我想使用 .NET 控制台应用程序自动执行此操作。是否可以在 .NET 中捕获 PRINT 语句输出?还有另一种捕获 SQL PRINT 输出的方法吗?
我有一个 SQL 语句,它通过 PRINT 命令输出另一个 SQL 语句。现在我必须在 SQL 编辑器中手动运行它,复制生成的字符串查询并在不同的窗口中运行该查询。
我想使用 .NET 控制台应用程序自动执行此操作。是否可以在 .NET 中捕获 PRINT 语句输出?还有另一种捕获 SQL PRINT 输出的方法吗?
当我来到这里寻找您直接问题的答案时,即“如何捕获打印命令的输出”,我想扩展先前的答案。
如果您正在使用多个打印语句构建 sql 命令,则可以在 set 命令中连接各个部分
SET @sqlCommand = @sqlCommand + @newPart;
不幸的是,但有时我会遇到问题,因为 sqlserver 认为我已经超过了 @sqlCommand 的最大大小,而我没有。我通过分开保存这些部分来解决这个问题,无论如何我经常需要同一部分的变体,然后在 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 并且我不使用最后一个子句。
代替
Print @sql
做一个
Select @sql
以您想要的方式捕获它(ADO、Linq2Sql、EF),然后正常运行该语句。通过在记录集中返回 sql,您可以依赖任何框架处理数据的正常方式,而不是尝试执行并非旨在实际返回数据的操作(您的 sql 实际上是正在返回的数据)。
如果你愿意,你甚至可以跳过这一步
EXEC sp_executesql @sql
绕过整个往返行程。 EXEC和sp_ExecuteSql文档。
如果您使用的是 sql server / oracle,您可以很容易地执行动态 sql
对于 sql server,您可以使用 EXEC 或 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
如果您使用的是 oracle,那么您需要使用 EXECUTE IMMEDIATE