我的存储过程中有一个名为internal的参数。如果“internal”= yes,那么我想在结果中再显示2列。如果不是,我不想显示这些列。
我可以做一个case语句,然后我可以将列设置为空,但仍会在结果中返回列名。
我的问题是:
谢谢
答案 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更容易理解/调试/调整。