我将SQL Server 2005用于我的小型Web应用程序。我希望将参数传递给SP。 但有一个条件。可以随时更改的参数数量。 想想,这次我通过姓名和地址,下次我通过姓名,地址,
此参数范围可能是1-30,
答案 0 :(得分:12)
使用默认参数声明过程,并使用命名参数而不是位置参数调用它:
CREATE PROCEDURE usp_myProcedure
@name varchar(100) = '',
@surname varchar(100) = '',
@address varchar(100) = ''
AS
BEGIN
...
END
从T-SQL调用它:
exec usp_myProcedure @name='John', @surname = 'Doe';
exec usp_myProcedure @name='Jane', @address = '123 Anystreet';
从C#调用它:
SqlCommand cmd = new SqlCommand('usp_MyProcedure', ...);
cmd.CommandType = commandtype.StoredProcedure;
cmd.Parameters.AddWithValue('@name', 'John');
cmd.Parameters.AddWithValue('@surname', 'Doe');
答案 1 :(得分:10)
您可以使用XML类型。以下是一个示例程序:
CREATE PROCEDURE udsp_VariableParams(@params XML) AS BEGIN DECLARE @vdoc INT EXEC sp_xml_preparedocument @vdoc OUTPUT, @params SELECT * FROM OPENXML(@vdoc, '/params/param', 1) WITH ([paramname] VARCHAR(40), [paramvalue] VARCHAR(150)) EXEC sp_xml_removedocument @vdoc END EXEC udsp_VariableParams '<params> <param paramname="name" paramvalue="value"/> <param paramname="address" paramvalue="value"/> </params>' EXEC udsp_VariableParams '<params> <param paramname="name" paramvalue="value"/> <param paramname="surname" paramvalue="value"/> <param paramname="address" paramvalue="value"/> </params>'
答案 2 :(得分:6)
您可以在SP级别设置参数的默认值,以使参数成为可选参数。
e.g。
CREATE PROCEDURE dbo.Test
@param1 int, -- Not an optional
@param2 int = 10, --Optional
@param3 bit = 0, --Optional
@param4 varchar(50) = '', --Optional
@param5 nvarchar(100) = null --Optional
-- more parameters .....
AS
BEGIN
-- The SQL goes here...
END
然后您可以根据自己的选择填充可选参数。
答案 3 :(得分:1)
从XML准备和提取标签是一种性能杀手。不一致的执行时间取决于计划是否被缓存。
使用NVARCHAR(MAX)是更好的选择。只需使用“@ name = Value”对准备参数字符串,并根据需要添加唯一参数sepearetor。在程序中使用SUBSTRING,CHARINDEX等来获取单个参数。