Sql server 如何向SQL Server存储过程传递数量可变的参数?

Sql server 如何向SQL Server存储过程传递数量可变的参数?,sql-server,stored-procedures,parameters,Sql Server,Stored Procedures,Parameters,我将SQLServer2005用于我的小型web应用程序。我想把参数传递给SP。 但有一个条件。可随时更改的参数数。 想一想,这次我传名字和地址,下次我传名字,姓氏,地址 此参数范围可能为1-30,您可以在SP级别设置参数的默认值,使参数成为可选参数 e、 g 然后,您可以选择填充可选参数。使用默认参数声明过程,并使用命名参数而不是位置参数调用过程: CREATE PROCEDURE usp_myProcedure @name varchar(100) = '', @surname va

我将SQLServer2005用于我的小型web应用程序。我想把参数传递给SP。 但有一个条件。可随时更改的参数数。 想一想,这次我传名字和地址,下次我传名字,姓氏,地址


此参数范围可能为1-30,

您可以在SP级别设置参数的默认值,使参数成为可选参数

e、 g


然后,您可以选择填充可选参数。

使用默认参数声明过程,并使用命名参数而不是位置参数调用过程:

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类型。以下是一个示例程序:

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>'
准备和从XML中提取标记是性能杀手。不一致的执行时间取决于计划是否缓存


使用NVARCHARMAX是一个更好的选择。只需准备带有@name=Value对的参数字符串,并在需要时添加一个唯一的参数分隔符。在程序内部,使用SUBSTRING、CHARINDEX等获取单个参数。

我认为这对于OPs问题来说太过分了,但对于我目前遇到的问题来说,它可能真的很有用!:谢谢+1. 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>'