首页 > 解决方案 > 参数化过程 不同场景

问题描述

我有一个要求,其中有参数化过程,例如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 万条记录的表时,它会丢失一些记录。

标签: sqlsql-serverstored-procedures

解决方案


以下是我将如何使用三个程序来解决这个问题。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

推荐阅读