我爲我的小型Web應用程序使用了SQL Server 2005。我希望將參數傳遞給SP。 但有一個條件。可隨時更改的參數數量。 想到,這一次我通過名稱和地址,下一次我通過姓名,地址,如何將可變數量的參數傳遞給SQL Server存儲過程?
這個參數範圍可能是1-30,
我爲我的小型Web應用程序使用了SQL Server 2005。我希望將參數傳遞給SP。 但有一個條件。可隨時更改的參數數量。 想到,這一次我通過名稱和地址,下一次我通過姓名,地址,如何將可變數量的參數傳遞給SQL Server存儲過程?
這個參數範圍可能是1-30,
您可以在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
然後,您可以根據您的選擇填充可選參數。
你聲明使用默認參數的程序,你命名參數而不是位置參數來調用它:
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準備和提取標記是一個性能殺手。不一致的執行時間取決於計劃是否被緩存。
改爲使用NVARCHAR(MAX)是更好的選擇。只需使用「@ name = Value」對準備參數字符串,並根據需要添加唯一的參數分隔符。在程序內部使用SUBSTRING,CHARINDEX等來獲取單個參數。
我認爲這對OPs問題有點矯枉過正 - 但認爲它對於我目前遇到的問題可能非常有用! :) 謝謝! +1 – 2012-03-22 09:11:28