我有这个小项目,我正在工作,我得到了一个部分,我想做一些特定的东西,但似乎无法找出一个有效的解决方案。基本上我在Visual Studio中创建了一个用于移动应用程序的Web服务,我们想要添加一个新功能,允许从多个用户检索客户端。要做到这一点,我需要能够将一个值数组传递给WHERE IN子句,我发现这几乎是不可能的,但我读过的其他解决方案(没有真正的过程示例)是创建一个Array值表,然后创建一个WHERE IN(SELECT * from TEMPTABLE)类型的场景。
所以这就是我被困住的地方,我如何将值数组传递给我的SQL语句,然后创建这些值的临时表(可以是1到30个值),这样我就可以运行了对这些值的其他查询。我见过的大多数示例都将临时表硬编码为值,但是我需要能够为该表传递一个随机数量的值,所以如果它更容易传递它们,因为一个带逗号的单个字符串很好或者如果他们需要以特定格式传递我也可以在调用Web服务之前在iOS端执行此操作,我似乎无法弄清楚如何执行此动态类型的表以继续下一部分。
编辑(根据评论添加一些信息)
关于系统和目的的一些背景信息,以帮助更好地理解我正在做的事情。数据库是一个SQL Server(2008),已有现有的表和数据,因为我正在处理的是现有Web应用程序的移动应用程序端口。我可以使用的两个表是代理表(针对员工)和客户表(针对他们的客户),因此在某些情况下,我们有可以查看彼此客户端的团队。所以通常如果我想从一组代理中提取客户端列表,我会使用WHERE IN语句,但对于Web服务,它需要将该组作为变量,因为Rep可能只想看到少数团队成员或所有团队成员(这将是iOS应用程序中设置的选项)。
我真的没有可行的代码,而且我所知道的大部分内容都不起作用所以我会放一些伪代码来解释我想要做什么。起初我以为我可以这样做:
SELECT C.first_name + ' ' + C.last_name as [Client Name]
FROM dbo.agent as A INNER JOIN
dbo.contact as C ON C.agent_id = A.id
WHERE (A.id IN (@RepList))
在此示例中,@ RTList将是从iOS App传递到Web Service的字符串,其中包含在Application中选择的所有ID。正如我已经研究过的那样,我在WHERE IN语句中没有变量,但是我已经读过如果我用变量创建一个Temp Table,那么我可以像这样引用它:
CREATE TABLE #TempTable (TempID VARCHAR(MAX))
INSERT INTO #TempTable (TempID)
VALUES (@RepList)
SELECT C.first_name + ' ' + C.last_name AS [Client Name]
FROM dbo.agent AS A INNER JOIN
dbo.contact AS C ON A.id = C.agent_id
WHERE (A.id IN (SELECT #TempTable.* FROM #TempTable))
同样,@ RTList将是从iOS应用程序传递到将运行此查询的Web服务的ID列表。这就是我被困住的地方,因为我似乎无法弄清楚如何将一个值列表作为变量传递到TempTable中。这可能最终只是Visual Studio中的一个问题(因为我遇到了SQL查询设计器的问题,并且它不接受最终在WebService中工作的某些事情)但我想确保这是正确的格式所以在前进之前。最后,WebService需要能够根据人们想要查看的许多代理返回客户端列表(这可以从1个代理到20个代理)。
答案 0 :(得分:0)
由于您使用的是SQL Server 2008和VS2010,因此最好的解决方案可能是使用Table-Valued参数。此链接(here)描述了如何从.Net客户端使用它们。
基本思想是,您的Web服务代码将在SQL Server上调用过程,函数或参数化查询,其中一个参数是值表。然后,SQL代码将使用该表值参数作为源匹配表而不是临时表。