我会尽量保持这一点。
我在SSRS中有一个报告,其中@Position参数需要能够接受多个值(请参阅下面WHERE子句中的参数)。
DECLARE @multiplier INT;
SET @multiplier = 30
SELECT p.Fname,
p.Lname,
p.Position,
(SUM(plg.PTS)/SUM(plg.MP))*@multiplier AS PTS,
(SUM(plg.TRB)/SUM(plg.MP))*@multiplier AS TRB,
(SUM(plg.AST)/SUM(plg.MP))*@multiplier AS AST,
(SUM(plg.BLK)/SUM(plg.MP))*@multiplier AS BLK,
(SUM(plg.STL)/SUM(plg.MP))*@multiplier AS STL,
(SUM(plg.TOV)/SUM(plg.MP))*@multiplier AS TOV,
(SUM(plg.FT)/SUM(plg.MP))*@multiplier AS FTs,
--SUM(plg.FTA)/SUM(plg.MP))*@multiplier AS FTAs,
SUM(plg.FT)/SUM(plg.FTA) AS FT_Percentage,
(SUM(plg.FG)/SUM(plg.MP))*@multiplier AS FGs,
--SUM(plg.FGA)/SUM(plg.MP))*@multiplier AS FGAs,
SUM(FG)/SUM(FGA) as Field_Percentage,
(SUM(plg.[3P])/SUM(plg.MP))*@multiplier AS Threes,
--SUM(plg.[3PA])/SUM(plg.MP))*@multiplier AS TP%
SUM([3P])/SUM([3PA]) AS Three_Point_Percentage
FROM PlayerGameLog plg
INNER JOIN Players p
ON p.PlayerID = plg.PlayerID
WHERE plg.PlayerID IN (SELECT PlayerID
FROM Players
WHERE lname != 'westbrook')
AND p.TeamID = 'OKC'
AND p.Position = @Position
GROUP BY p.Fname, p.Lname, p.Position
ORDER BY PTS DESC;
如果我更改以下行:
AND p.Position = @Position
要:
AND p.Position IN @Position
我收到一条消息,提示我Define Query Paramters。无论我将它们设置为什么,我都会遇到一条消息:there is an error.我已经更改了参数以允许多个值,但仍然没有骰子。有任何想法吗?
答案 0 :(得分:0)
尝试使用动态SQL
像这样的东西
DECLARE @SQLString varchar(8000)
SET SQLString = 'SELECT p.Fname,
p.Lname,
p.Position,
(SUM(plg.PTS)/SUM(plg.MP))*@multiplier AS PTS,
(SUM(plg.TRB)/SUM(plg.MP))*@multiplier AS TRB,
(SUM(plg.AST)/SUM(plg.MP))*@multiplier AS AST,
(SUM(plg.BLK)/SUM(plg.MP))*@multiplier AS BLK,
(SUM(plg.STL)/SUM(plg.MP))*@multiplier AS STL,
(SUM(plg.TOV)/SUM(plg.MP))*@multiplier AS TOV,
(SUM(plg.FT)/SUM(plg.MP))*@multiplier AS FTs,
--SUM(plg.FTA)/SUM(plg.MP))*@multiplier AS FTAs,
SUM(plg.FT)/SUM(plg.FTA) AS FT_Percentage,
(SUM(plg.FG)/SUM(plg.MP))*@multiplier AS FGs,
--SUM(plg.FGA)/SUM(plg.MP))*@multiplier AS FGAs,
SUM(FG)/SUM(FGA) as Field_Percentage,
(SUM(plg.[3P])/SUM(plg.MP))*@multiplier AS Threes,
--SUM(plg.[3PA])/SUM(plg.MP))*@multiplier AS TP%
SUM([3P])/SUM([3PA]) AS Three_Point_Percentage
FROM PlayerGameLog plg
INNER JOIN Players p
ON p.PlayerID = plg.PlayerID
WHERE plg.PlayerID IN (SELECT PlayerID
FROM Players
WHERE lname != '''westbrook''')
AND p.TeamID = '''OKC'''
AND p.Position IN( ' + @Position + ')
GROUP BY p.Fname, p.Lname, p.Position
ORDER BY PTS DESC;'
EXEC @SQLString
答案 1 :(得分:0)
您对SQL查询的不同部分的范围感到困惑。
考虑以下两个条款:
WHERE Position IN ('1', '2', '3')
WHERE Position IN ('1, 2, 3')
你能看到这些不相同吗?第一个是查找三个单位数值中的任何一个。第二个是查找SINGLE值,字符串长度为7个字符,有3个数字,2个空格和2个逗号。
执行Position IN @Position
后,您将执行类似第二个表达式的操作。当然,问题在于字符串内容不会以某种方式发生"突破"他们的价值和成为SQL,以便他们代表三个价值观。它是一个值,它将保留一个值。
我鼓励您首先停止使用存储过程并在应用程序层中编写代码,您可以在其中编写所需的SQL语句。然后,您可以使用IN
构建正确的SQL语句。或者您可以插入临时表并加入到该表中。
或者,如果绝对必须继续使用存储过程,则将@Position
的内容解析为临时表或表变量。查找SQL字符串拆分。
最后,如另一个答案所述,您可以使用动态SQL,但最好避免这种情况。如果你能提供帮助,请不要去那里。我向你保证,如果你能完全避开它,那么沿着这条路走下去并不好。