【发布时间】:2010-03-21 01:47:40
【问题描述】:
我将 SQL Server 2005 用于我的小型 Web 应用程序。我想将参数传递给 SP 。 但是有一个条件。可以不时更改的参数数量。 想想,这次我传递姓名和地址,下次我传递姓名,姓氏,地址,
这个参数范围可以是1-30,
【问题讨论】:
标签: sql-server stored-procedures parameters
我将 SQL Server 2005 用于我的小型 Web 应用程序。我想将参数传递给 SP 。 但是有一个条件。可以不时更改的参数数量。 想想,这次我传递姓名和地址,下次我传递姓名,姓氏,地址,
这个参数范围可以是1-30,
【问题讨论】:
标签: sql-server stored-procedures parameters
您使用默认参数声明过程并使用命名参数而不是位置参数调用它:
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');
【讨论】:
您可以使用 XML 类型。这是一个示例程序:
创建过程 udsp_VariableParams(@params XML) 作为 开始 声明@vdoc INT 执行 sp_xml_preparedocument @vdoc 输出,@params SELECT * FROM OPENXML(@vdoc, '/params/param', 1) WITH ([paramname] VARCHAR(40), [paramvalue] VARCHAR(150)) 执行 sp_xml_removedocument @vdoc 结尾 执行 udsp_VariableParams ' ' 执行 udsp_VariableParams ' '【讨论】:
您可以在SP级别设置参数的默认值,使参数变为可选。
例如
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
然后您可以根据自己的选择填充可选参数。
【讨论】:
从 XML 中准备和提取标签是性能杀手。执行时间不一致取决于计划是否被缓存。
使用 NVARCHAR(MAX) 是一个更好的选择。只需使用“@name=Value”对准备参数字符串,并在需要时添加唯一的参数分隔符。在程序内部使用 SUBSTRING、CHARINDEX 等来获取各个参数。
【讨论】: