【问题标题】:Multiple values in a single parameter of a scalar function标量函数的单个参数中的多个值
【发布时间】:2013-12-30 01:23:37
【问题描述】:

有没有办法在 SQL Server 2008 R2 中的标量值函数的单个参数中输入多个值,并使用这两个值通过该参数过滤数据?

例如我想做以下事情

    SET @Salesperson='BILL' OR 'MOSES'

    SELECT Sum(SalesDollars)
    FROM Invoices
    WHERE Invoices.Salesperson = @Salesperson

我尝试使用以下作为 WHERE 子句,但这也不起作用。

    SET @Salesperson='BILL','MOSES'

    SELECT Sum(SalesDollars)
    FROM Invoices
    WHERE Invoices.Salesperson IN (@Salesperson)

如果我处理整数而不是 varchar 值会更容易吗?

任何帮助将不胜感激!

【问题讨论】:

    标签: sql sql-server parameters filtering user-defined-functions


    【解决方案1】:

    您需要使用表值参数。在technetmsdn 上查找它

    最好的部分是您的表值参数可以有多个列。

    但请注意,您必须将 TVP 参数定义为只读。所以如果你想从你的函数中返回类似的集合,你需要在你的函数中创建另一个变量。

    例子:

      CREATE TYPE Names AS TABLE 
      ( Name VARCHAR(50));
      GO
    
      /* Create a procedure to receive data for the table-valued parameter. */
      CREATE PROCEDURE dbo.mySP
          @n Names READONLY
          AS 
          SELECT Sum(SalesDollars)
          FROM 
          WHERE Invoices.Salesperson in (select Name from @n)
      GO
    
      CREATE FUNCTION dbo.myFun(@n Names READONLY) returns int
          AS
          SELECT Sum(SalesDollars)
          FROM 
          WHERE Invoices.Salesperson in (select Name from @n)
      GO
    
      /* Declare a variable that references the type. */
      DECLARE @names AS Names;
    
      /* Add data to the table variable. */
      INSERT INTO @names (Name)
      VALUES ('BILL'),('MOSES')
    
      -- using stored procedure with TVP
      EXEC dbo.mySP @names
    
      -- using function with TVP
      select dbo.myFun(@names)
      GO
    

    【讨论】:

    • 是的,我的错。急忙回答。
    【解决方案2】:

    这可以这样做:

    SET @Salesperson='BILL,MOSES'
    
    SELECT *
    FROM YourTable
    WHERE Invoices.Salesperson IN (SELECT * FROM dbo.split(@Salesperson,','))
    

    This is how 你拆分了值。

    【讨论】:

    • 这看起来相当简单易用,我唯一遇到的问题是 dbo.split 的对象名称无效。这是您自己创建的函数吗?
    • 在理解了 vittore 的回答之后,我现在明白了你的意思——我实际上以同样的方式命名了我的表值函数,所以我可以按照你的建议使用它。 Toda raba Yosi
    【解决方案3】:

    我通常会使用用户定义的表类型:SQL Fiddle Example

    CREATE TYPE <schema>.SalespersonList AS TABLE
    (
       Name varchar(32)
    )
    

    您可能必须授予该类型的执行权限:

    GRANT EXECUTE ON TYPE::<schema>.SalespersonList TO <user> 
    

    然后你可以创建一个函数来使用它:

    CREATE FUNCTION <schema>.fnGetTotalSales
    (
        @nameList <schema>.SalespersonList READONLY
    )
    RETURNS INT
    AS
    BEGIN 
        DECLARE @ret INT
    
        SELECT @ret = Sum(SalesDollars)
        FROM Invoices i
        INNER JOIN @nameList nl ON nl.Name = i.Salesperson
    
        RETURN @ret
    END 
    

    然后您只需将列表插入类型并调用函数:

    DECLARE @salesPersonList <schema>.SalespersonList 
    
    INSERT INTO @salesPersonList (Name)
    SELECT 'Bill'
    UNION 
    SELECT 'Moses'
    
    SELECT <schema>.fnGetTotalSales(@salesPersonList)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      相关资源
      最近更新 更多