我需要处理一些难题,我正试图找到一个很好的解决方案。我正在使用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值,那么我怎样才能解决这个问题呢?
答案 0 :(得分:2)
你最好的选择不是在Proc中完成,而是在客户端代码中。
答案 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