2

SQL Server 2008 のストアド プロシージャ内で、名前付きパラメーターの使用を要求する方法があるかどうか疑問に思っています。それができない場合は、名前付きパラメーターが使用されているかどうかを確認する方法で十分です。

外部システムによって呼び出されるいくつかの比較的複雑なストアド プロシージャの開発を検討しており、外部システムのデータが混同または欠落しているリスクを最小限に抑える方法を探しています。

ストアド プロシージャは、(少なくとも私たちにとっては) 数十個までの比較的多数のパラメーターを処理します。ありがとう!

4

2 に答える 2

0

ストアド プロシージャを記述するときは、MUST PASS 変数を先頭に含め、次にオプションの変数をデフォルト値を割り当てて含めます。

また、ストアド プロシージャ内でそれらを検証することもできます。例:

If @Var = ''
Begin
 SET @Var = 'Default'
END

もう 1 つ使用できるのは、.Net の例外です。ストアド プロシージャに必要な変数を渡さなかった場合、パラメーター x が必要であるが指定されていない (またはこれに似たもの) という例外がスローされます。その例外をキャッチし、適切な方法でユーザーに送り返します。

または、アプリケーション レベルですべてのパラメーターを検証します (それらをストアド プロシージャに取得する前であっても)

于 2012-12-05T04:30:34.830 に答える
0

この sproc は、「dbcc inputbuffer」コマンドを使用します。このコマンドを使用するには、「VIEW SERVER STATE」権限が必要であるか、sysadmin ロールに属しています。パラメータ名が使用されていないときにエラーを発生させることで、名前付きパラメータの要件を強制できると思います。

create procedure usp_Example
    @LastName nvarchar(50), 
    @FirstName nvarchar(50),
    @Initials nvarchar(10) = 'Default Initials'
as begin

    declare @inputBuffer  table (eventtype nvarchar(30), parameters int, eventinfo nvarchar(255))
    declare @execStatement nvarchar(255)

    --get sql for sproc execution
    insert into @inputBuffer
    exec ('dbcc inputbuffer (' + @@spid + ') with no_infomsgs')
    select top 1 @execStatement = eventinfo from @inputBuffer

    --get named parameters      
    select s.name
    from sys.all_parameters s where s.object_id = @@PROCID and CHARINDEX(s.name,@execStatement) > 0

    --do stored proc specific operations

end

go
--test with no parameter naming
exec usp_Example 'LastName','FirstName','Initials'
go
--test with parameter naming
exec usp_Example @lastName = 'LastName',@Firstname = 'FirstName',@Initials = 'Initials'
go
--test with parameter naming and default value
exec usp_Example @LastName = 'LastName',@FirstName = 'FirstName'
go
于 2012-12-05T08:12:19.387 に答える