如何为用户运行每个条目的SQL查询?

时间:2016-02-02 16:20:30

标签: sql-server

因此,用户输入的格式为:2000,2001,2002

我需要为这3个策略号中的每一个运行一个查询。我不知道该怎么做。

这是我现在的代码。我正在考虑某种字符串操作然后使用循环,但我不知道该怎么做。有人可以帮帮我吗?

declare @sql1 varchar(1000)

declare @policy varchar(1000)

set @policy = '2000, 2001, 2002'

--THIS IS WHERE i NEED HELP???
set @policy = replace(@policy, ' ', '')

set @policy = '''' + replace(@policy, ',', ''',''') + ''''

print (@policy)


if  @policy <>  'null'   
set @sql1 = 
(SELECT top 1
      [MIL]     
FROM 
      [DataManagement].[dbo].[lookuptable]  where [policy] =  @policy  group by [MIL] ) 
exec (@sql1)
 print(@sql1) 

1 个答案:

答案 0 :(得分:0)

选项:

  1. 您确定在@policy中每个项目确实需要一个结果集,而不是一个匹配任何ID的结果集吗?一个IN查询可以让你得到那个结果 - 遗憾的是你不能做WHERE IN(@List),但它可以连接成一个动态查询(抛开SQL注入 - 确保你的数据源,但这适用于任何东西就像你似乎那样接受输入。
  2. 如果将@Policy声明为用户定义的表类型变量,则可以将其作为ID列表传递,然后循环遍历它。 (更多信息 - http://blog.sqlauthority.com/2008/08/31/sql-server-table-valued-parameters-in-sql-server-2008/https://www.brentozar.com/archive/2014/02/using-sql-servers-table-valued-parameters/
  3. 网上有一些代码可以将分隔的字符串列表拆分成值表。这样你就可以按照我在第2点的建议那样做。
  4. FOR XML PATH('')技巧可用于获取结果表并将其展平为单个变量。如果你加入你的值表并从你的问题中构建SELECT查询作为结果,那么你可以做一个EXEC而根本不需要循环。
  5. 真正取决于您对环境的需求。我使用选项2来拆分字符串,然后使用FOR XML PATH构建组合的单个查询并执行它。但对于某些环境,表值参数和循环方法肯定会更优越。