通过存储过程中的不同列值从单个表中选择多个表

时间:2009-07-27 20:31:28

标签: asp.net sql-server sql-server-2005 tsql stored-procedures

我需要处理一些难题,我正试图找到一个很好的解决方案。我正在使用MS SQL Server 2005,并给出一个表,其中uniqueidentifier列包含服务器上其他信息的数据密钥。我需要做的是选择此数据表中的每一行(来自ASP.NET的sproc),但是基于这一列分成表。例如,来自

------------------------------------
MyID    |  MyOtherData
------------------------------------
 4         asdf
 4         test
 3         qwerty
 2         morestuff

我想要返回以下三个表:

------------------------------------
MyID    |  MyOtherData
------------------------------------
 4         asdf
 4         test

------------------------------------
MyID    |  MyOtherData
------------------------------------
 3         qwerty

------------------------------------
MyID    |  MyOtherData
------------------------------------
 2         morestuff

如果我不知道提前有多少个独特的MyID值,那么我怎样才能解决这个问题呢?

5 个答案:

答案 0 :(得分:2)

你最好的选择不是在Proc中完成,而是在客户端代码中。

  1. 编写一个返回的查询/ proc 不同的MyID值(SELECT 来自MyTable的独特MYID)
  2. 在您的应用中,循环浏览每个 选择值并调用另一个proc 获取MyID值并返回 该值的记录集。 (从MyTable中选择MyOtherData,其中MyID =?)

答案 1 :(得分:1)

这里唯一想到的是,这不是一个好主意....但是会创建一个Cursor,它适用于查询

SELECT DISTINCT MyId 来自MyTable

然后,光标的每次迭代都会进行相应的选择......

答案 2 :(得分:1)

我认为您应该尝试重新考虑您的方法,因为我认为它不会具有很大的可扩展性,而且我认为从长远来看,试图找到实现这一目标的方法是不值得的。

相反,您是否可以返回单个结果集,按MyID排序,然后在.NET中以不同方式处理该结果集?

答案 3 :(得分:0)

您可以创建一个循环结构,该循环结构遍历主表的ID的子集,为每组表格分配一个单独的结果集。这很难看,但希望这只是一些特别的事情,你想要摆脱困境,并希望永远不必再次处理。

DECLARE @Entities TABLE
(
     ID int IDENTITY (1, 1) PRIMARY KEY NOT NULL,
     MyID int,
     MyOtherData varchar(100)
)

INSERT INTO @Entities (MyID, MyOtherData)
SELECT MyID, MyOtherData
FROM TheMainTable
ORDER BY MyID, MyOtherData

DECLARE @Count int
DECLARE @Max int

SET @Count = 1
SELECT @Max = COUNT(ID) FROM @Entities

DECLARE @MyID_Current int

WHILE (@Count <= @Max)
BEGIN

     SELECT @MyID_Current = MyID
     FROM @Entities
     WHERE ID = @Count

     -- Output each individual result set.
     SELECT MyID, MyOtherData
     FROM @Entities
     WHERE MyID = @MyID_Current

     SET @Count = @Count + 1

END

对于更丑陋的东西,你可以在每次迭代时只生成单独的结果集CREATE或SELECT INTO数据库中一个新的,唯一命名的表,并将特定的MyID记录插入到该表中。

答案 4 :(得分:0)

DECLARE @Entities TABLE
(
 ID int IDENTITY (1, 1) PRIMARY KEY NOT NULL,
 MyID int,
 MyOtherData varchar(100)
)

INSERT INTO @Entities (MyID, MyOtherData)
SELECT MyID, MyOtherData
FROM TheMainTable
ORDER BY MyID, MyOtherData

DECLARE @Count int
DECLARE @Max int

SET @Count = 1
SELECT @Max = COUNT(ID) FROM @Entities

DECLARE @MyID_Current int

WHILE (@Count <= @Max)
BEGIN

 SELECT @MyID_Current = MyID
 FROM @Entities
 WHERE ID = @Count

 -- Output each individual result set.
 SELECT MyID, MyOtherData
 FROM @Entities
 WHERE MyID = @MyID_Current

 SET @Count = @Count + 1

END