【发布时间】:2020-03-02 21:24:11
【问题描述】:
我有许多表都有一个 DATETIME 类型的“已删除”字段,我用它来将记录标记为已删除(而不是完全删除它们)。
我经常发现自己从这些表中请求数据并希望排除已删除的记录。我现在正在做的事情是这样的:
SELECT A.*
FROM (SELECT * FROM [TargetTable] WHERE (Deleted IS NULL)) AS A
WHERE (.........)
是否可以有一个存储过程/函数,我可以将表名传递给它并返回过滤后的表?比如:
SELECT A.*
FROM fnExcludeDeleted('MyTable') AS A
WHERE (.........)
我尝试使用表值函数来执行此操作,但据我所知,我需要定义结果表的列。我不能这样做,因为它并不总是我使用该函数的同一张表。
【问题讨论】:
-
您可以使用 SP 和动态 SQL 执行此操作,但是将子句
DELETE IS NULL添加到您的查询有什么问题... -
或者使用视图来做同样的事情。您也可以考虑将其编入索引。
-
@Larnu 我对 SP 不够熟悉,不知道该怎么做。并且找不到怎么做,因为我不知道要什么。
-
我个人建议你不要。需要时写下你的很短的
WHERE子句。 -
@SMor 我无法索引视图,因为如果我尝试使用“WITH SCHEMABINDING”,我会收到错误消息“在模式绑定对象中不允许使用语法'*'。”如果我不使用“WITH SCHEMABINDING”,我将无法为视图编制索引。
标签: sql-server function stored-procedures dynamic