【问题标题】:SQL Server Cursor data as result of stored procedureSQL Server 游标数据作为存储过程的结果
【发布时间】:2010-04-04 13:02:45
【问题描述】:

我有一个存储过程

DECLARE cursor FOR SELECT [FooData] From [FooTable];
OPEN cursor ;  
FETCH NEXT FROM cursor INTO @CurrFooData;
WHILE @@FETCH_STATUS = 0
BEGIN
  SELECT @CurrFooData AS FooData;
  INSERT INTO Bar (BarData) VALUES(@CurrFooData);
  FETCH NEXT FROM cursor INTO @CurrFooData;
END;
CLOSE cursor 
DEALLOCATE cursor 

但结果我有很多表,而不是一张。如何返回一个包含 'FooData' 列和所有 '@CurrFooData' 行的表?

【问题讨论】:

  • 这个例子没问题,但是如果select语句和insert中的列列表不一样呢?
  • 点赞:DECLARE cursor FOR SELECT [FooData1], [FooData2] From [FooTable];打开光标; FETCH NEXT FROM cursor INTO @CurrFooData1, @CurrFooData2;而@@FETCH_STATUS = 0 开始选择 @CurrFooData1 作为 FooData1,@CurrFooData2 作为 FooData2;插入条形(BarData)值(@CurrFooData1); FETCH NEXT FROM cursor INTO @CurrFooData;结尾; CLOSE 游标 DEALLOCATE 游标
  • 问答毫无意义:你为什么要这么做?

标签: sql-server stored-procedures select resultset


【解决方案1】:

Dmitry,我认为你真的应该尝试完全摆脱那个光标。在第二个示例中,您选择了两个字段 FooData1FooData2,但最后,您只插入了值....

您可以轻松地重写第二个查询 - 类似于:

INSERT INTO Bar (BarData) 
    SELECT FooData1 FROM FooTable

这就是你的整个光标和一切真正在做的事情。

不惜一切代价尽量避免使用游标 - 99% 的情况下,它们是不需要的 - 开始考虑数据集 - 不要拘泥于 SQL 中的过程循环和游标 - 这不是一个很好的匹配!

如果您需要输出刚刚插入的内容,请使用OUTPUT 子句:

INSERT INTO Bar (BarData) 
    OUTPUT Inserted.* 
    SELECT FooData1 FROM FooTable

【讨论】:

  • 我需要从存储过程中返回数据("SELECT @CurrFooData1 AS FooData1, @CurrFooData2 AS FooData2" 做到了)。但是“INSERT INTO .. SELECT..”不返回任何数据。
  • @Dmitry:更新了我的答案 - 使用 OUTPUT 子句重新输出您刚刚插入的内容
【解决方案2】:

是要输出刚才插入的数据吗?如果是这种情况,并且如果您使用的是 SQL Server 之前 SQL Server 2005 的版本,那么您可以将所需的值填充到临时表中,如下所示:

Create Table #FooTemp ( FooData ... )

Insert #FooTemp( FooData )
Select FooData
From FooTable

Insert Bar( BarData )
Select FooData
From #FooTemp

Select FooData
From #FooTemp

这种方法的缺点是,由于临时表,它可能会导致每次运行存储过程时都重新编译它。

如果您使用的是 SQL Server 2000+,您可以仅在表变量中执行与上述相同的操作:

Declare @FooTemp Table ( FooData ... )

Insert @FooTemp( FooData )
Select FooData
From FooTable

Insert Bar( BarData )
Select FooData
From @FooTemp

Select FooData
From @FooTemp

如果您使用的是 SQL Server 2005+,则可以像这样使用 OUTPUT 子句:

Insert Bar( BarData )
 OUTPUT inserted.BarData
Select FooData
From FooTable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多