如何在SQL Server中创建数据集并处理每条记录?
我有下表:如何在SQL Server中创建数据集并处理每条记录?,sql,sql-server,Sql,Sql Server,我有下表: CREATE TABLE [dbo].[proposalReviewAction] ( [proposalReviewActionID] [INT] IDENTITY(1,1) NOT NULL, [proposalPackageID] [INT] NULL, [approvalTypeID] [INT] NULL, [comments] [VARCHAR](2000) NULL, [reviewedByID] [INT] NULL,
CREATE TABLE [dbo].[proposalReviewAction]
(
[proposalReviewActionID] [INT] IDENTITY(1,1) NOT NULL,
[proposalPackageID] [INT] NULL,
[approvalTypeID] [INT] NULL,
[comments] [VARCHAR](2000) NULL,
[reviewedByID] [INT] NULL,
[reviewedDate] [DATETIME] NULL
) ON [PRIMARY]
我想返回每个记录的approvalTypeID=100,并在将数据从提案表移动到项目表的另一个过程中使用proposalPackageID
我考虑过使用WHILE
循环,但似乎每个人都喜欢处理数据集,但我找不到任何方法在SQL/T-SQL中实现这一点
我找到了一个WHILE
循环的示例,并对其进行了修改
WHILE (SELECT[approvalTypeID] FROM [proposalReviewAction]) = 100
BEGIN
DECLARE @ppID AS INT ;
SELECT [proposalPackageID] AS ppID, [approvalTypeID] AS atID
FROM [proposalReviewAction]
IF (SELECT [approvalTypeID] AS atID FROM [proposalReviewAction]) = 100
PRINT @ppID
ELSE
BREAK
END
PRINT 'I got to the print statement';
。。。但我得到了以下错误:
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时
然后,它打印“PRINT”语句
感谢您的帮助
Bob鉴于此表:
CREATE TABLE [dbo].[proposalReviewAction]
(
[proposalReviewActionID] [INT] IDENTITY(1,1) NOT NULL,
[proposalPackageID] [INT] NULL,
[approvalTypeID] [INT] NULL,
[comments] [VARCHAR](2000) NULL,
[reviewedByID] [INT] NULL,
[reviewedDate] [DATETIME] NULL
) ON [PRIMARY]
您可以使用简单的select语句选择approvalTypeID=100的所有记录
SELECT * FROM dbo.proposalReviewAction WHERE approvalTypeID = 100;
如果您只需要proposalPackageID
,则可以使用查询选择它
SELECT proposalPackageID FROM dbo.proposalReviewAction WHERE approvalTypeID = 100;
根据处理情况,您也可以从此处直接插入到“项目表”中
INSERT INTO [projectTable] (proposalPackageID ...)
SELECT proposalPackageID, ...
FROM dbo.proposalReviewAction WHERE approvalTypeID = 100;
注意:如果我们使用子查询,并且在这种情况下它返回一个值,那么我们可以使用(=,!=,,…)
或者多个值,在这种情况下,我们应该使用(在、任何、所有、某些中)您只需将这些记录直接插入到您的
项目表中即可!比如:
INSERT INTO [ProjectTable] (...)
SELECT proposalPackageID
FROM [proposalReviewAction]
WHERE approvalTypeID = 100
如果出于其他原因需要循环,您可以使用光标而不是WHILE
。使用光标可帮助您逐个记录查询变量的结果,并分别处理每条记录:
DECLARE @proposalPackageID INT
DECLARE product_cursor CURSOR FOR
SELECT proposalPackageID
FROM dbo.proposalReviewAction
WHERE approvalTypeID = 100
OPEN product_cursor
FETCH NEXT FROM product_cursor INTO @proposalPackageID
WHILE @@FETCH_STATUS = 0
BEGIN
-- Insert directly into projectTable or call external process
INSERT INTO [projectTable] (proposalPackageID ...)
SELECT @proposalPackageID
FETCH NEXT FROM product_cursor INTO @proposalPackageID
END
CLOSE product_cursor
DEALLOCATE product_cursor
希望这会有所帮助错误信息非常清楚。您的子查询返回超过1行,您正在尝试查看是否等于100。如果有多行,如何计算?我必须同意,在循环中这样做是一种糟糕的方式,无论你在做什么。Sql应该是基于集合的,而不是RBAR(一行接一行)。@SeanLange,你有什么建议吗?我建议使用基于集合的方法。除非你真的需要,否则就不要管这个循环。您说了一些关于处理行的内容,但不清楚这意味着什么。游标只是执行循环的另一种方式。第三次(从我这里)你在循环中做什么?这是这里的重要部分。然后更改流程,使其可以处理集合而不是RBAR。但至少如果你只想处理approvalTypeID=100的行,你应该在第一个select中添加where子句,这样你只会得到你想处理的行,而不是看你不关心的行。我想你错过了我说的那部分,“我想返回approvalTypeID=100的每条记录,并在将数据从提案表移动到项目表的另一个过程中使用proposalPackageID。“我已经得到了列表,我只需要循环并处理每条记录。这些记录作为列表返回,然后您可以单独或整体地对它们执行任何操作。您还需要说明为了获得更明确的帮助,您希望进行何种处理。游标和循环在DB中非常昂贵,这取决于处理过程,但您可能需要在应用程序中这样做。人们喜欢在数据库中进行基于集合的处理是有原因的。谢谢,这很有效。。。我尝试使用游标(我将游标添加到上面的注释中),但在FETCH中缺少“INTO”语句。
DECLARE @proposalPackageID INT
DECLARE product_cursor CURSOR FOR
SELECT proposalPackageID
FROM dbo.proposalReviewAction
WHERE approvalTypeID = 100
OPEN product_cursor
FETCH NEXT FROM product_cursor INTO @proposalPackageID
WHILE @@FETCH_STATUS = 0
BEGIN
-- Insert directly into projectTable or call external process
INSERT INTO [projectTable] (proposalPackageID ...)
SELECT @proposalPackageID
FETCH NEXT FROM product_cursor INTO @proposalPackageID
END
CLOSE product_cursor
DEALLOCATE product_cursor