SQL Server存储过程未知数量的变量

时间:2014-06-24 05:48:56

标签: sql sql-server-2008 stored-procedures

我有一个包含多个表的SQL Server 2008数据库。我正在为用户编写存储过程以从表中获取一些市场价值。

EG。我的表格包含Currency[Market Value][Hedging][Customer ID]列。

现在,用户可以通过指定客户ID来选择查看货币,市场价值和对冲。

但是,我希望用户能够设置多个客户ID,并查看包含汇总值的表格。

因此,我希望看到客户ID 2,3和7的货币,市场价值和套期保值。

Select语句看起来像这样:

Select 
    [Currency], 
    sum([Market Value]), 
    sum([Hedging]) 
from 
    myDatabase
where 
    ([Customer ID] = 2 or [Customer ID] = 3 or [Customer ID] = 7)
Group by 
    [Currency], [Customer ID]

然后我可以指定一个参数,让用户决定使用哪个客户ID。问题是,我并不总是知道用户希望看到哪个客户ID组合。

如果我知道总会有三个客户ID,我可以设置三个参数,但有时可能只有一个客户ID,有时可能是5个。

有没有一种顺利的解决方法?

我正在考虑将我的select语句设置为字符串,然后通过exec命令执行它 - 但是我的程序很长,有几个内部和左部连接,临时表等,所以这个解决方案可能不是最好的选项。

有没有人对如何解决这个问题有一个好主意?

3 个答案:

答案 0 :(得分:2)

由于您使用的是SQL 2008,我建议使用强类型的更好的替代方案,并避免创建动态SQL的需要:用户定义的表类型(UDTT)

您可以创建一个包含整数值的通用表类型,如下所示:

CREATE TYPE IntegerList AS TABLE 
(
    Value int NOT NULL  
)
GO

然后在您的存储过程中,您将指定此类型的参数:

CREATE PROCEDURE [dbo].[MyProcedure]
    @customerIds IntegerList READONLY
AS
BEGIN

    -- here you can use the @customerIds variable as a (read only) table:
    SELECT Value FROM @customerIds

END

答案 1 :(得分:0)

where ([Customer ID] IN ({ids placeholder})

您可以使用“1,3,5,... n”字符串构建SELECTreplacing {ids placeholder}

答案 2 :(得分:0)

在存储过程中使用参数并将逗号分隔列表作为参数传递,例如:

Declare @customerIds nvarchar(100)
select @customerIds = '12,44,3,345'

Select [Currency], [Customer ID], sum([Market Value]), sum([Hedging]) from myDatabase
    where [Customer ID] ,in (@customerIds)
    Group by [Currency], [Customer ID]

此外,如果您想查看总聚合数,请通过

删除您组中的[客户ID]
Declare @customerIds nvarchar(100)
select @customerIds = '12,44,3,345'

Select [Currency], sum([Market Value]), sum([Hedging]) from myDatabase
    where [Customer ID] ,in (@customerIds)
    Group by [Currency]