我有一个包含多个表的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命令执行它 - 但是我的程序很长,有几个内部和左部连接,临时表等,所以这个解决方案可能不是最好的选项。
有没有人对如何解决这个问题有一个好主意?
答案 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]