11

I applied the SQL Server Data Tools patch to Visual Studio 2012 (Premium) and created a SQL Server CLR user-defined function project in C#:

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlInt32 Add42(SqlInt32 in_param)
    {
        SqlInt32 retval = in_param + 42;  // Set break point here.
        return retval;
    }
}

In the SQL Server Object Explorer pane, I right-click on the newly published UDF and select "Execute Function..." I am prompted to supply a sample input value, and Visual Studio then publishes the function (again) to my local 2012 SQL Server and generates a script that looks like this:

DECLARE    @return_value Int

EXEC    @return_value = [dbo].[Add42] @in_param = 5

SELECT    @return_value as 'Return Value'

GO

... and executes it, returning the expected result of 47.

If I now put a break point on an executable line in my CLR UDF C# code, right-click the UDF function in SQL Server Object Explorer, and this time select "Debug Function...", I land in a debugger for the generated SQL test script. I can step through the SQL statements to the end of the script, which returns the correct result, but the breakpoint in my C# code is never reached in the C# debugger.

The terminology for this feature seems misleading. To any programmer, "debugging" a function means stepping through the executable lines in the code of the function itself. Simply generating a SQL test harness that calls my compiled function and gets back the result is just "testing" the function. At most, the only thing being "debugged" is the tool-generated test itself, because you can't "Step Into" the CLR code. The only option is to "Step Over" it.

So how do I get Visual Studio to actually debug, and hit the breakpoint in my UDF C# code?

4

4 に答える 4

9

さて、私はついにこれを理解しました。VS 2012 で SQL CLR コードをデバッグするには:

  1. UDF、sproc、またはその他の CLR オブジェクトを呼び出す SQL テスト スクリプトを作成します。(これは、質問で説明されているように、サーバー オブジェクト エクスプローラーの [関数の実行] または [関数のデバッグ] オプションを使用して行うことができます。)

  2. 生成されたスクリプトを保存します。(デフォルトでは「SQLQuery1.sql」のような名前になります。より意味のある名前を付けることができます。)

  3. ソリューション エクスプローラーで、UDF (または他の CLR タイプ) プロジェクトを右クリックし、[プロパティ] を選択します。

  4. プロジェクトのプロパティ タブが開きます。左側で、[デバッグ] カテゴリを選択します。

  5. [デバッグ] パネルの [アクションの開始] サブカテゴリで、[起動スクリプト:] ラジオ ボタンを選択します。これにより、関連するドロップダウンが有効になり、手順 1 で作成した .sql スクリプトを指定できるようになります。

  6. すべてを保存し、C# またはその他の .NET 言語コードの実行可能な行でブレークポイントを切り替えて、デバッグ ボタンを押します。

注: 「 Windows ファイアウォールにより、このプログラムの一部の機能がブロックされました」というダイアログが表示される場合があります。ドメインとプライベート ネットワークへのアクセスを許可するボックスをオンにしました。

ここで続行すると、ブレークポイントに到達するはずです。

于 2013-11-08T16:51:41.403 に答える
2

SSDT がこれを変更するかどうかはわかりませんが、VS2008 では次のように .net UDF をデバッグします。

  • ローカルの SQL サーバーにデプロイします。
  • 次に、VS を SQL Server プロセスにアタッチします (メニュー デバッグ/process/sqlserver.exe へのアタッチ。SQL Server がサービスとして実行されている場合は、VS を管理者として起動する必要があります)。
  • 次に、Management Studio などで UDF を呼び出す SQL コードを実行します。おそらく、これは VS 2012 の SSDT から機能するでしょう。
于 2013-11-06T23:55:57.447 に答える
1

適用したパッチは、Visual Studio Quarterly update で最新ではない VS アイテムをインストールする可能性があります。VS 2012の最新のVisual Studio Quarterly Updateを適用することをお勧めします。

于 2013-11-07T00:06:57.293 に答える