根据参数在存储过程中显示几列

时间:2017-05-11 12:42:18

标签: sql-server

我的存储过程中有一个名为internal的参数。如果“internal”= yes,那么我想在结果中再显示2列。如果不是,我不想显示这些列。

我可以做一个case语句,然后我可以将列设置为空,但仍会在结果中返回列名。

我的问题是:

  1. 有没有办法不在结果中返回这两列?
  2. 我可以在一个案例陈述中进行,而不是每列的单独案例陈述吗?
  3. 谢谢

4 个答案:

答案 0 :(得分:1)

CASE是一个函数,只能返回一个值。

根据你的评论: -

  

2个选择语句的问题在于它是一个很复杂的问题   选择陈述,我真的不想拥有整体   选择声明两次。

因此您可以使用下一种方法来避免重复代码: -

Create procedure proc_name (@internal char(3), .... others)
as
BEGIN
    declare @AddationalColumns varchar(100)
    set @AddationalColumns = ''

    if @internal = 'Yes'
        set @AddationalColumns = ',addtionalCol1 , addtionalCol2'

        exec ('Select 
                col1, 
                col2,
                col3' 
                + @AddationalColumns +
                'From
                    tableName
                Where ....
                ' )
END

答案 1 :(得分:0)

尝试IF条件

IF(internal = 'yes')
BEGIN
    SELECT (Columns) FROM Table1
END
ELSE
BEGIN
    SELECT (Columns With additional 2 columns) FROM Table1
END

答案 2 :(得分:0)

你可以做这样的解决方案。它允许您只保留一个代码副本,如果它非常重要,但您必须处理动态SQL。

CREATE TABLE tab (col1 INT, col2 INT, col3 INT);
GO

DECLARE @internal BIT = 0, @sql NVARCHAR(MAX) 

SET @sql = N'SELECT col1 ' + (SELECT CASE @internal WHEN 1 THEN N', col2, col3 ' ELSE N'' END) + N'FROM tab'

EXEC sp_executesql @sql
GO

DROP TABLE tab
GO

答案 3 :(得分:0)

另一个选择是创建一个'wrapper'proc。保持现有的不受影响。 创建一个执行此操作的新proc(伪代码):

create proc schema.wrapperprocname (same @params as current proc)

as

begin

Create table #output (column list & datatypes from current proc);

insert into #output
exec schema.currentproc (@params)

if @internal = 'Yes'
select * from #output
else
select columnlist without the extra 2 columns from #output

end

这样复杂的select语句仍然封装在原始proc中。 你唯一的开销是保持#output表&选择此proc中的列表与原始proc的任何更改同步。

IMO比动态sql更容易理解/调试/调整。