我想知道 SQL Server 2008 中的存储过程中是否有方法要求使用命名参数?如果做不到这一点,一种判断是否使用命名参数的方法就足够了。
我们正在考虑开发一些将由外部系统调用的相对复杂的存储过程,并且我正在寻找方法来最大限度地减少外部系统数据混淆和/或丢失的风险。
存储过程将处理相对大量的参数(至少对我们而言),多达几十个。谢谢!
我想知道 SQL Server 2008 中的存储过程中是否有方法要求使用命名参数?如果做不到这一点,一种判断是否使用命名参数的方法就足够了。
我们正在考虑开发一些将由外部系统调用的相对复杂的存储过程,并且我正在寻找方法来最大限度地减少外部系统数据混淆和/或丢失的风险。
存储过程将处理相对大量的参数(至少对我们而言),多达几十个。谢谢!
编写存储过程时,通过分配默认值在顶部包含必须传递的变量,然后包含可选的变量。
您也可以在存储过程中验证它们,例如:
If @Var = ''
Begin
SET @Var = 'Default'
END
您可以使用的另一件事是 .Net 中的异常。当您没有传递存储过程所需的变量时,它将抛出一个异常,指出参数 x 是必需的但未提供(或类似的东西)。捕获该异常并以适当的方式将其发送回用户。
或在应用程序级别验证所有参数(甚至在将它们放入存储过程之前)
此存储过程使用“dbcc inputbuffer”命令。要使用此命令,您需要“查看服务器状态”权限或属于 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