2009-07-27 43 views
0

我有一些需要处理的难题,我试图找到一个好的解决方案。我正在使用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值会提前?

+1

我在这里的真正问题是为什么?这最终可能会有多个结果集......并且可能非常麻烦。 – 2009-07-27 20:38:11

+1

我假设他指的是结果集,他指的是“桌子”,但我与米切尔。此优惠与一次性返还全部优惠相比有什么好处? – JohnFx 2009-07-27 20:57:28

回答

2

最好的办法是不要在Proc中这样做,而是在客户端代码中。

  1. 写一个查询/ PROC,返回 不同MYID值(SELECT 鲜明MYID FROM MyTable的)
  2. 在你的应用,选择的循环通过每个 值和调用另一个PROC 采用一个MYID值和返回 该值的记录集。 (从MyTable中选择我MyOtherData MyID =?)
1

是给来这里介意,这是不是一个很好的主意....但将创建一个游标,上,做了查询工作的唯一的事

SELECT DISTINCT身份识别码 FROM MyTable的

然后,光标的每一次迭代做相应的选择...

1

我想你应该尝试并重新审视自己的方法,因为我不认为这将是非常可扩展性,我想试图找到从长远来看,实现这一目标的方式并不值得。

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

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 

对于一些甚至是丑陋的,你可以,而不是仅仅培养出了单独的结果集创建或选择到一个新的,独特的命名表中你在每次迭代数据库,并插入一个特别的身份识别码的记录成表。

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 
相关问题