Sql server SQL SERVER:将前1整行选择到“row”变量中

Sql server SQL SERVER:将前1整行选择到“row”变量中,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我试图将SELECT TOP*的结果中的整行存储到一种datarow变量中,因为稍后,根据某些条件,我需要将整行插入到一个临时表中 例如,我已经做了以下工作。问题是,首先我必须将select top 1*产生的值分配给变量,然后使用所有这些变量插入到临时表中,因此我想避免这种情况,我希望将select top 1*的整行一次插入到临时表中,见下文 当前情景: 如果可能的话,我想这样做: 所需场景: 您不需要任何@Row变量。只需使用插入到。。。选择 您可以这样做: SELECT Aux.Fiel

我试图将SELECT TOP*的结果中的整行存储到一种datarow变量中,因为稍后,根据某些条件,我需要将整行插入到一个临时表中

例如,我已经做了以下工作。问题是,首先我必须将select top 1*产生的值分配给变量,然后使用所有这些变量插入到临时表中,因此我想避免这种情况,我希望将select top 1*的整行一次插入到临时表中,见下文

当前情景:

如果可能的话,我想这样做:

所需场景:


您不需要任何@Row变量。只需使用插入到。。。选择


您可以这样做:

SELECT Aux.Field1, Aux.Field2, Aux.Field3
    INTO #tmpTbl
    FROM  ( SELECT TOP 1 Field1, Field2, Field3 FROM OneTable ) Aux

通过这样做,您将创建tmpTbl,如果它已经存在,您将不得不在再次创建它之前删除它。

如果提取行的时间不重要,即您可以在if块中愉快地选择它,您可以使用插入到。。。从组合中进行选择,以通过以下方式实现所需效果:

CREATE TABLE #tmpTbl(Field1 varchar(50),  Field2 int, Field3 DateTime)

--EXECUTE STORE PROCEDURE
DECLARE @ReturnValue int
EXEC @ReturnValue=MySp @Field1

IF @ReturnValue > 0
BEGIN
    INSERT INTO #tmpTbl (Field1, Field2, Field3)
    SELECT TOP 1 field1, field2, field3 from OneTable
END

可以使用表类型的变量。为什么呢?你想干什么?可能有一种set-baset解决方案不需要跟踪行或使用临时表。例如,INSERT和UPDATE都允许您通过插入和删除的表访问修改后的值,甚至可以像SELECT语句一样返回这些值。这不是我要找的。。。在插入行之前,我需要通过调用存储过程来检查一些条件。如果条件满足,那么我将插入到临时表中,如果不满足,我就不插入。@user1624552-您正在采用非常程序化的方法来解决问题,这不适合SQL数据库正常工作的地方。也就是说,你要把事情分成几个部分,首先我做X,然后我做Y,然后我做Z。如果你能把整个问题作为一个单一的查询来解决,并让它找出解决问题的最佳方法,那么SQL最有效。@Damien_不信者是的,我知道,但在我的情况下,这是不可能按照你说的方式来做的。我试过了,但不可能。这只是一个小例子,但不是我的真实情况。当然,最好的方法是使用相同的select,使用联接,甚至在需要时与cte结合使用,但在我的情况下是不可能的。我有一个不属于我的存储过程,我无法触摸。如果这个存储过程是一个标量o表格函数,那么我的问题将通过在一个select中调用该函数来解决,该函数可以完成所有操作,但您不能从select中调用存储过程。@Damien\u不信者。。。另外,不能从函数调用存储过程,这是可能的,但不推荐使用,因为它会产生副作用。在我的例子中,我有一个存储过程,它是决定行是否在一组行上进行的条件,然后我需要将它与第二组行合并。第一组行不在第二组行内,反之亦然。最终结果必须包含来自第一组和第二组行的列。在我的帖子中,我没有告诉任何关于最终结合的事情。@Damien_不信者基本上迫使我以程序化的方式进行的问题是我在前面的评论中所说的,但最大的罪魁祸首是存储过程,我不能触摸它并将其更改为函数,它不是我的。我也对TriV说过同样的话。
CREATE TABLE #tmpTbl(Field1 varchar(50),  Field2 int, Field3 DateTime)

INSERT INTO #tmpTbl (Field1, Field2, Field3)
SELECT TOP 1 
       field1, field2, field3 
from OneTable       
SELECT Aux.Field1, Aux.Field2, Aux.Field3
    INTO #tmpTbl
    FROM  ( SELECT TOP 1 Field1, Field2, Field3 FROM OneTable ) Aux
CREATE TABLE #tmpTbl(Field1 varchar(50),  Field2 int, Field3 DateTime)

--EXECUTE STORE PROCEDURE
DECLARE @ReturnValue int
EXEC @ReturnValue=MySp @Field1

IF @ReturnValue > 0
BEGIN
    INSERT INTO #tmpTbl (Field1, Field2, Field3)
    SELECT TOP 1 field1, field2, field3 from OneTable
END