【发布时间】:2022-01-05 22:07:58
【问题描述】:
我一直在查看存储过程中的游标示例,所有这些似乎都在打印到控制台或在主循环中操作数据。
我的情况如下:
- 创建一个从单个表返回过滤行的存储过程。
- 为没有
WHERE子句的简单SELECT语句创建一个游标。 - 遍历提取周期。
- 仅返回满足特定条件的行。
伪代码(C#、EntityFrameworkCore):
var name = "xyz";
var email = "";
var users = new List<User>();
foreach (var user in context.Users.AsQueryable())
{
var added = false;
if (!added)
{
if ((!string.IsNullOrWhitespace(name)) && (user.Name.Contains(name)))
{
users.Add(user);
}
}
if (!added)
{
if ((!string.IsNullOrWhitespace(email)) && (user.Name.Contains(email)))
{
users.Add(user);
}
}
}
这些条件可能非常复杂,无法放入WHERE 子句中。因此查看游标。
只是不知道该怎么想。游标是一个迭代器,但如何累积过滤后的行以返回?
任何建议将不胜感激。
这是我想在其中使用游标的存储过程:
CREATE OR ALTER PROCEDURE SpUserSearch
@Condition BIT = 0, -- AND=0, OR=1.
@Name NVARCHAR(100) = NULL,
@Email NVARCHAR(100) = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @UseName BIT
DECLARE @UseEmail BIT
IF ((@Name IS NULL) OR (LEN(@Name) = 0)) SET @UseName = 0 ELSE SET @UseName = 1
IF ((@Email IS NULL) OR (LEN(@Email) = 0)) SET @UseEmail = 0 ELSE SET @UseEmail = 1
IF (@Condition = 0)
SELECT [Id], [Name], [Email]
FROM [User]
WHERE
((@UseName = 1) OR ([Name] LIKE '%' + @Name + '%'))
AND
((@UseEmail = 1) OR ([Email] LIKE '%' + @Email + '%'))
ELSE
SELECT [Id], [Name], [Email]
FROM [User]
WHERE
((@UseName = 1) OR ([Name] LIKE '%' + @Name + '%'))
OR
((@UseEmail = 1) OR ([Email] LIKE '%' + @Email + '%'))
RETURN (@@ROWCOUNT)
END
【问题讨论】:
-
太复杂的
WHERE子句是什么?你似乎只有相当直截了当的那些。至少只要您使用标准的kitchen-sink query 技术 -
@Charlieface,该示例旨在使其易于在 SO 上阅读。您包含的链接确实有一个在运行时动态构造和执行查询的示例,因此确实为我的另一个问题here 提供了替代方案。谢谢。
-
好的,你能不能不假思索地给我们一个实际的问题。您觉得必须使用游标的
WHERE子句是什么? -
语句“这里是我想在其中使用游标的存储过程”是 100% 错误的。你一开始就不想使用游标!在适当的时候使用光标(这种情况很少见)!
标签: c# sql stored-procedures database-cursor