2010-03-21 127 views

回答

6

您可以在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 

然後,您可以根據您的選擇填充可選參數。

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'); 
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

我認爲這對OPs問題有點矯枉過正 - 但認爲它對於我目前遇到的問題可能非常有用! :) 謝謝! +1 – 2012-03-22 09:11:28

1

從XML準備和提取標記是一個性能殺手。不一致的執行時間取決於計劃是否被緩存。

改爲使用NVARCHAR(MAX)是更好的選擇。只需使用「@ name = Value」對準備參數字符串,並根據需要添加唯一的參數分隔符。在程序內部使用SUBSTRING,CHARINDEX等來獲取單個參數。

相關問題