【问题标题】:Capturing MS SQL output [duplicate]捕获 MS SQL 输出 [重复]
【发布时间】:2012-06-08 16:57:50
【问题描述】:

可能重复:
How Can i display the output of SQL “PRINT” Command in C#?

我有一个 SQL 语句,它通过 PRINT 命令输出另一个 SQL 语句。现在我必须在 SQL 编辑器中手动运行它,复制生成的字符串查询并在不同的窗口中运行该查询。

我想使用 .NET 控制台应用程序自动执行此操作。是否可以在 .NET 中捕获 PRINT 语句输出?还有其他方法可以捕获 SQL PRINT 输出吗?

【问题讨论】:

    标签: .net sql sql-server-2008


    【解决方案1】:

    当我来到这里寻找您直接问题的答案时,即“如何捕获打印命令的输出”,我想扩展先前的答案。

    如果您正在使用多个打印语句构建 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 并且我不使用最后一个子句。

    【讨论】:

      【解决方案2】:

      代替

      Print @sql
      

      做一个

      Select @sql
      

      捕获它你想要的方式(ADO,Linq2Sql,EF)然后正常运行语句。通过在记录集中返回 sql,您可以依靠任何框架处理数据的正常方式,而不是尝试执行并非旨在实际返回数据的事情(您的 sql 实际上是正在返回的数据)。

      如果你愿意,你甚至可以跳过这一步

      EXEC sp_executesql @sql
      

      绕过整个往返行程。 EXECsp_ExecuteSql 文档。

      【讨论】:

      • 如果我必须使用打印语句怎么办?我不仅从表中选择,还输出创建另一个 sql 查询的字符串。
      • 如果你必须这样做,那么我为你担任那个职位感到抱歉。我没有(也不希望)从打印语句中提取数据的经验。
      【解决方案3】:

      如果您使用的是 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

      【讨论】:

        猜你喜欢
        • 2011-02-01
        • 2022-01-17
        • 1970-01-01
        • 2016-09-04
        • 1970-01-01
        • 2014-04-18
        • 1970-01-01
        • 2014-03-13
        相关资源
        最近更新 更多