如何有选择地返回SQL Server上的存储过程内的行?

时间:2014-03-26 18:18:31

标签: sql sql-server tsql stored-procedures

我有一个基本存储过程,只需从数据库中返回一个select,如下所示:

CREATE PROCEDURE MyProcedure
AS
BEGIN
  SELECT * FROM MyTable
END
GO

但是现在我需要为我的select的每一行执行一些逻辑。根据结果​​我需要返回或不返回此行。我会使用游标运行我的select语句,检查规则并返回或不返回行。像这样:

CREATE PROCEDURE MyProcedure
AS
BEGIN

  DECLARE CURSOR_MYCURSOR FOR SELECT Id, Name FROM MyTable
  OPEN CURSOR_MYCURSOR
  FETCH NEXT FROM CURSOR_MYCURSOR INTO @OUTPUT1, @OUTPUT2

  WHILE (@@FETCH_STATUS=0)
  BEGIN

  IF (SOME_CHECK)
    SELECT @OUTPUT1, @OUTPUT2
  ELSE
    --WILL RETURN SOMETHING ELSE

  END

END
GO

第一个问题是,每次执行SELECT @OUTPUT1, @OUTPUT2时,行都会以不同的结果集的形式发回,而不是在我需要的单个表中。

当然,将一些逻辑应用于一行听起来像是一个“功能”工作。但是我不能使用函数的结果来过滤所选的结果。那是因为当我的检查返回false时,我需要选择其他东西来替换有缺陷的行。所以,我需要返回有缺陷的行,这样我才能知道它们并替换为其他行。

这个方法的另一个问题是我需要声明相当多的变量,以便我可以通过游标迭代输出它们。并且这些变量需要遵循原始表属性的数据类型,并且如果原始表上的某些内容发生更改,则不会失去同步。

那么,基于标准返回单个结果集的最佳方法是什么?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我建议使用游标,但问题的简单解决方法是使用table variabletemp table

DECLARE @MyTable TABLE
    (
     ColumnOne VARCHAR(20)
    ,ColumnTwo VARCHAR(20)
    )

CREATE TABLE #MyTable
    (
     ColumnOne VARCHAR(20)
    ,ColumnTwo VARCHAR(20)
    )

在游标内部,您可以插入与您的逻辑匹配的记录

INSERT INTO @MyTable VALUES (@Output1, @Output2)
INSERT INTO #MyTable VALUES (@Output1, @Output2)

完成光标后,只需select表中的所有内容

SELECT * FROM @MyTable
SELECT * FROM #MyTable