【问题标题】:How to pass a variable number of parameters to a SQL Server stored procedure?如何将可变数量的参数传递给 SQL Server 存储过程?
【发布时间】:2010-03-21 01:47:40
【问题描述】:

我将 SQL Server 2005 用于我的小型 Web 应用程序。我想将参数传递给 SP 。 但是有一个条件。可以不时更改的参数数量。 想想,这次我传递姓名和地址,下次我传递姓名,姓氏,地址,

这个参数范围可以是1-30,

【问题讨论】:

    标签: sql-server stored-procedures parameters


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您可以使用 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 ' '

      【讨论】:

      • 我认为这对于 OPs 问题来说是多余的——但认为它对于我目前遇到的问题可能真的很有用! :) 谢谢! +1
      【解决方案3】:

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

      然后您可以根据自己的选择填充可选参数。

      【讨论】:

        【解决方案4】:

        从 XML 中准备和提取标签是性能杀手。执行时间不一致取决于计划是否被缓存。

        使用 NVARCHAR(MAX) 是一个更好的选择。只需使用“@name=Value”对准备参数字符串,并在需要时添加唯一的参数分隔符。在程序内部使用 SUBSTRING、CHARINDEX 等来获取各个参数。

        【讨论】:

          猜你喜欢
          • 2015-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-28
          • 1970-01-01
          • 2013-07-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多