以下是我可以在StoredProcedure中声明参数的方法。
@Doc_Type_Id int
和
@Doc_Type_ID int=null
第二个实现显示此参数是可选的。
现在我正在使用
动态检测参数SqlCommandBuilder.DeriveParameters(cmd);
我如何区分这两种类型的参数。两者的ParameterDirection仅为输入。请建议。
答案 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.
*/