sql - 参数化过程 不同场景
问题描述
我有一个要求,其中有参数化过程,例如USP_NAME
,如果用户''
在参数中传递(空白),那么应该运行不同的查询集。
例如,
何时应该运行。
什么时候应该运行。Exec USP_NAME ''
Select A,B,C from tbl
Exec USP_NAME 'XYZ'
Select A,B,C,D from tbl
这两个查询都是在相同的过程下编写的。
create proc USP_NAME (@name varchar(100))
as
begin
if @name = ' '
begin
select A,B,C from tbl
end
if @name <> ' '
begin
select A,B,C,D from tbl
end
end
我正在尝试这种东西,但在某处结果丢失了。在数据量较少的情况下运行良好,但是当使用具有 100 万条记录的表时,它会丢失一些记录。
解决方案
以下是我将如何使用三个程序来解决这个问题。Gail Shaw 在这里有一篇关于这个主题的精彩文章。https://sqlinthewild.co.za/index.php/2009/09/15/multiple-execution-paths/
create procedure ABC
as
set nocount on;
select A,B,C from tbl
GO
create procedure ABCD
as
set nocount on;
select A,B,C,D from tbl
GO
create proc USP_NAME (@name varchar(100))
as
begin
if @name = ''
exec ABC
else
exec ABCD
end
- 编辑 -
如果您想轻松处理 NULL 或空字符串,您可以稍微反转逻辑并使用一种经常被忽视的处理 NULL (> '') 的方式。这样,如果您收到一个空字符串或一个 NULL,它将执行 ABC,否则如果您收到任何字符,它将执行 ABCD。
create proc USP_NAME (@name varchar(100))
as
begin
if @name > ''
exec ABCD
else
exec ABC
end
推荐阅读
- php - 将数据发送到 Web 服务的 SOAP curl 错误:“服务器无法处理请求。”
- python - tensorflow.GraphDef 在序列化过程中被同时修改
- python - 如何根据 Google Sheets API 正确打印对象列表属性?
- azure - 查询重复更新的 Azure 数据库的最佳实践
- ios - 如何将多个参数传递给 Swift #selector?
- xml - 如何使用 XMLReader 变量读取值?
- sql - 为什么 Redshift datediff 在天数相同的情况下给出不同的周数?
- shell - 如何使用 Dimporttsv 将 csv 文件从 hdfs 加载到 hbase 表
- ssis - 脚本任务在 visual-studio-2017 (SSDT) 中不起作用
- javascript - 如何解决 Chrome 73 中 bxSlider 项目上的单击事件问题?