-1

我有一个我正在工作的小项目,我想要做一些具体的事情,但似乎无法找到一个可行的解决方案。基本上,我在 Visual Studio 中创建了一个用于移动应用程序的 Web 服务,我们希望添加一个新功能,允许从多个用户检索客户端。为此,我需要能够将一组值传递给 WHERE IN 子句,我发现这几乎是不可能的,但我读过的其他解决方案(没有真实的过程示例)是创建一个数组值的表,然后到一个 WHERE IN (SELECT * from TEMPTABLE) 类型的场景。

所以这就是我卡住的地方,我如何将一组值传递给我的 SQL 语句,然后创建一个包含这些值的临时表(范围可以从 1 到 30 个值),这样我就可以运行其他查询那些价值观。我见过的大多数示例都有用值硬编码的临时表,但我需要能够为该表传递随机数量的值,所以如果将它们作为带有逗号的单个字符串传递更容易,或者如果它们需要以特定格式传递,我也可以在调用 Web 服务之前在 iOS 端执行此操作,但我似乎无法弄清楚如何执行这种动态类型的表以继续下一部分.

编辑(根据评论添加一些信息)

所以一些关于系统和目的的背景信息有助于更好地理解我在做什么。数据库是一个 SQL Server (2008),已经存在表和数据,因为我正在处理的是现有 Web 应用程序的移动应用程序端口。例如,我可以使用的两个表是代理表(针对员工)和客户表(针对他们的客户),因此在某些情况下,我们的团队可以查看彼此的客户。因此,通常如果我想从一组代理中提取客户列表,我会使用 WHERE IN 语句,但对于 Web 服务,它需要将该组作为变量,因为代表可能只想看到几个团队成员或所有团队成员(这将是 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))

在此示例中,@RepList 将是从 iOS 应用程序传递到 Web 服务的字符串,其中包含在应用程序中选择的所有 ID。正如我所研究的那样,我在 WHERE IN 语句中不能有变量,但我已经读过,如果我用变量创建一个临时表,那么我可以像这样引用它:

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))

同样,@RepList 将是从 iOS 应用程序传递到将运行此查询的 Web 服务的 ID 列表。这就是我卡住的地方,因为我似乎无法弄清楚如何将值列表作为变量传递到 TempTable 中。这最终可能只是 Visual Studio 中的一个问题(因为我遇到了 SQL 查询设计器的问题并且它不接受最终在 WebService 中工作的某些东西)但我想确保这是正确的做事格式所以在前进之前。最后,WebService 需要能够根据人们想要查看的代理数量返回一个客户端列表(范围可以从 1 个代理到 20 个代理)。

4

1 回答 1

0

由于您使用的是 SQL Server 2008 和 VS2010,因此最好的解决方案可能是使用表值参数。此链接(此处)描述了如何从 .Net 客户端使用它们。

基本思想是,您的 Web 服务代码将调用 SQL Server 上的过程、函数或参数化查询,其中一个参数是值表。然后 SQL 代码将使用该表值参数作为其源匹配表而不是临时表。

于 2012-08-15T17:46:40.973 回答