我有一个基本存储过程,只需从数据库中返回一个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时,我需要选择其他东西来替换有缺陷的行。所以,我需要返回有缺陷的行,这样我才能知道它们并替换为其他行。
这个方法的另一个问题是我需要声明相当多的变量,以便我可以通过游标迭代输出它们。并且这些变量需要遵循原始表属性的数据类型,并且如果原始表上的某些内容发生更改,则不会失去同步。
那么,基于标准返回单个结果集的最佳方法是什么?
提前致谢。
答案 0 :(得分:1)
我建议使用游标,但问题的简单解决方法是使用table variable
或temp 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