在C#中检测此参数差异

时间:2010-01-15 08:01:59

标签: c# stored-procedures

以下是我可以在StoredProcedure中声明参数的方法。

@Doc_Type_Id int

@Doc_Type_ID int=null

第二个实现显示此参数是可选的。

现在我正在使用

动态检测参数
SqlCommandBuilder.DeriveParameters(cmd);

我如何区分这两种类型的参数。两者的ParameterDirection仅为输入。请建议。

4 个答案:

答案 0 :(得分:1)

我认为你不能分辨出来。您需要具体的原因吗?

我的主要回答是,真的要看看你是否真的需要使用SqlCommandBuilder来为这样的存储过程派生参数?原因是,由于必须对数据库进行往返以获取此信息,因此会导致性能损失。

答案 1 :(得分:0)

您可以致电:

获取参数列表

SELECT * 来自INFORMATION_SCHEMA.PARAMETERS 在哪里SPECIFIC_NAME ='yourSPnameHere'

但我认为这个链接可以真正帮助你

http://www.codeproject.com/KB/database/FindDefaultValueSPParams.aspx

我想这可能很有用。

答案 2 :(得分:0)

我尝试在SQL SERVER 2005中创建一个SP

alter PROCEDURE test
(
  @no INT,
  @id INT=0
)
AS 
 BEGIN
  SET @id=5
  PRINT @id
 END

现在我使用此查询

 SELECT * FROM INFORMATION_SCHEMA.PARAMETERS WHERE SPECIFIC_NAME='test'

两个参数的结果相同

如果我使用不同的查询

 SELECT
    p.name,    
    pm.parameter_id,
    pm.name AS parameter_name,
    pm.has_default_value,
    pm.default_value
 FROM sys.procedures p
   JOIN sys.parameters pm ON p.object_id = pm.object_id
   JOIN sys.types t ON pm.system_type_id = t.system_type_id
 WHERE p.name = 'test'

结果与

相同
pm.has_default_value,
pm.default_value

我认为即使SQL Server也不知道这种差异。

答案 3 :(得分:0)

使用SET FMTONLY ON允许在不修改数据或返回行的情况下验证参数值。然后对每个参数执行一次该过程,同时将其值设置为DEFAULT,将所有其他值设置为NULL。为每个非可选参数返回一个异常,该异常可由catch块处理。

CREATE PROC GetContacts(@name int = NULL, @phone int, @email int)
AS RETURN
GO

SET FMTONLY ON
EXEC GetContacts DEFAULT, null, null
EXEC GetContacts null, DEFAULT, null
EXEC GetContacts null, null, DEFAULT
SET FMTONLY OFF
GO

/*
-- Results
Msg 201, Level 16, State 4, Procedure GetContacts, Line 0
Procedure or function 'GetContacts' expects parameter '@phone', which was not supplied.
Msg 201, Level 16, State 4, Procedure GetContacts, Line 0
Procedure or function 'GetContacts' expects parameter '@email', which was not supplied.
*/