Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL Server中创建数据集并处理每条记录?_Sql_Sql Server - Fatal编程技术网

如何在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