T-SQL - 存储过程,可处理未知类型的未知数量的参数

时间:2012-02-10 16:39:49

标签: sql sql-server tsql stored-procedures

我有大量的存储过程基本上做同样的事情:获取一个值列表作为参数,然后转到某个表并选择这些值匹配的所有行。

我希望能够有一个能够处理所有这些情况的存储过程。

你会如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

不要这样做。您将把所有数据库性能排除在外。 T-SQL和代码重用不会混合。

可以做的是让所有这些存储过程自动生成。有许多工具可以做到这一点,你可以轻松地自己动手:使用SQL本身将表定义提取到XML中,然后使用XSLT将其转换为T-SQL并生成proc。它可以自动化到您的项目构建和连续的集成过程中。通过这种方式,您可以充分利用这两个方面:强类型,高效的T-SQL代码,以及灵活,干燥和可维护的流程,只需一次更改即可轻松重写所有100个流程。

答案 1 :(得分:2)

您可以尝试使用基于XML的方法来解决您的问题。发送XML作为输入参数。将xml转换为表格。从表格中动态查询并执行它以实现您所需的功能。请参阅以下示例。在此示例中,Departments是一个包含3列pkDepartmentId(int),DepartmentName(varchar)和BuildingNumber(int)的表。使用此方法,您可以发送n个参数及其值作为输入参数。

pkDepartmentId DepartmentName BuildingNumber 1电子与通讯1 2计算机科学2 3仪器与技术4

--EXEC TestProc '<Parameters>
--                  <Param>
--                      <ColumnName>pkDepartmentId</ColumnName>
--                      <ColumnValue>1</ColumnValue>        
--                  </Param>
--                  <Param>
--                      <ColumnName>DepartmentName</ColumnName>
--                      <ColumnValue>Electronics and Communication</ColumnValue>        
--                  </Param>
--                  <Param>
--                      <ColumnName>BuildingNumber</ColumnName>
--                      <ColumnValue>1</ColumnValue>        
--                  </Param>    
--              </Parameters>'

CREATE PROCEDURE TestProc
@parameters XML
AS
BEGIN
    DECLARE @temp1 TABLE
    (
          ColName VARCHAR(100)
        , ColVal VARCHAR(4000)      
    )

    INSERT INTO @temp1
    SELECT    Params.Col.value('ColumnName[1]', 'VARCHAR(50)') ColName
            , Params.Col.value('ColumnValue[1]', 'VARCHAR(50)') ColVal              FROM   @parameters.nodes('//Parameters/Param') Params(Col)

    DECLARE @sql VARCHAR(4000)

    SET @sql = 'SELECT * FROM Departments WHERE '

    SELECT @sql = @sql  + ColName + ' = ''' + ColVal  + ''' AND '
    FROM @temp1

    -- Trim last AND
    SET @sql = SUBSTRING(@sql, 1, LEN(@sql) - 3)

    PRINT @sql                  

    EXEC (@sql)             

END

在执行此proc时,获得以下结果 pkDepartmentId DepartmentName BuildingNumber 1电子与通信1

答案 2 :(得分:1)

如何使用表值参数TVP(假设您的SQL Server版本是&gt; = 2008)?但这并不能解决“未知类型”部分。我想你必须使用varchar(max)甚至nvarchar(max),然后根据需要进行投射......

请参阅:http://www.sommarskog.se/arrays-in-sql-2008.html

对于旧版本的SQL Server,另请参阅:

答案 3 :(得分:0)

默认参数:

create procedure MyPRoc1
(
@param1 int,
@param2 int =1
)
as
begin
    --code
end

您可以使用

调用它
exec MyPRoc1 10

exec MyPRoc1 1,1
相关问题