web-dev-qa-db-ja.com

T-SQL:ストアドプロシージャ内に「プライベート」関数を作成するにはどうすればよいですか

さて、SQL Server 2008ストアドプロシージャ(メンテナンススクリプト)を作成しています。

そうすることで、私は良い子であり、エラー処理、行数のチェック、出力メッセージの印刷などをたくさん行いました。

しかし、これを行うことで、私は自分自身が次のようなことを何度も何度も書いていることに気づきました:

SELECT @RowsAffected = @@ROWCOUNT
IF @RowsAffected > 0
BEGIN
   PRINT CAST(@RowsAffected, NVARCHAR(2)) + 'rows updated.'
END

または、次のようなメッセージをデバッグします。

PRINT 'User ' + CAST(@UserId AS NVARCHAR(5)) + ' modified successfully'

何かをパラメーターとして受け入れ(ただし、そうする必要はありません)、いくつかのロジックを実行できる、(プライベートメソッドのような)ストアドプロシージャ内に一種の「サブルーチン」を作成する方法はありますか?

私はこのようなことをしたいです:

CheckRowCounts

またはこれ:

PrintUserUpatedMessage(@UserId)

次に、上記のロジックを実行します(行数の確認、メッセージの出力など)

もちろん、UDFを作成することはできますが、このロジックはこのストアドプロシージャの実行中にのみ必要になるため、UDFを作成/削除する必要があります。

同じコードを何度も何度も書くことにうんざりし、エラーが発生したときに使用したさまざまな領域をすべて変更する=)

誰か助けてもらえますか?

[〜#〜]編集[〜#〜]

さて、私はスカラーUDF関数を作成することになりました(唯一の方法のようです)。

ただし、これを実装する予定はありませんが、正解であり、創造的なものであるため、Fredrikに正解を与えました。

すべてのアドバイス/ヘルプをありがとう。

22
RPM1984

私は最初に、既存のSP-は機能しませんでしたが、少し実験した後、このようなものを使用できると思います(そうでない場合)から、別の一時的なSPを作成しようとしました。動的SQLを気にする):

CREATE PROCEDURE sp_myTest_v1_0(@firstName NVARCHAR(255)) AS
BEGIN
    -- declare private method
    DECLARE @privateMethod NVARCHAR(255), @privateMethodSig NVARCHAR(255)
    SELECT @privateMethod = 
        'DECLARE @x INT' + CHAR(10) +
        'WHILE ISNULL(@x,0) < 10 BEGIN' + CHAR(10) +
            'PRINT @param1 + CAST(@x AS VARCHAR)' + CHAR(10) +
            'SET @x = ISNULL(@x,0)+1' + CHAR(10) +
        'END', @privateMethodSig = '@param1 NVARCHAR(255)'

    -- call privateMethod
    EXEC sp_executesql @privateMethod, @privateMethodSig, @param1 = @firstName
END
GO
21

tsqlではそのようなものではありません。あなたが言ったように、最も近いものはスカラーudfであり、あなたはそのアイデアのファンではないようです。そのようなヘルパー関数を作成してデータベースに残すことに問題はありません。確かにあなたは良いメッセージから利益を得ることができる他の手順を持っています。

0
nathan gonzalez