首页 > 解决方案 > 如何在 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,
    [reviewedDate] [DATETIME] NULL
) ON [PRIMARY]

我想返回每条记录,approvalTypeID = 100proposalPackageID在另一个将数据从提案表移动到项目表的过程中使用。

我考虑过使用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'; 

...但我收到以下错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

然后,它打印“PRINT”语句。

任何帮助表示赞赏...

鲍勃

标签: sqlsql-server

解决方案


您可以简单地将这些记录直接插入到您的ProjectTable! 喜欢:

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 

希望这会有所帮助


推荐阅读