Sql server 为不同的where条件选择相同的列列表

Sql server 为不同的where条件选择相同的列列表,sql-server,select,multiple-columns,Sql Server,Select,Multiple Columns,我有一个根据不同参数返回相同列的存储过程 比如, if name is not null select a,b,c,d,e,f from table1, table2, table3 where ..... if age is not null select a,b,c,d,e,f from table1, table2, table3,table4 where ..... if city is not null select a,b,c,d,e,f from table1,table3,t

我有一个根据不同参数返回相同列的存储过程

比如,

if name is not null
select a,b,c,d,e,f
from table1, table2, table3
where .....

if age is not null
select a,b,c,d,e,f
from table1, table2, table3,table4
where .....

if city is not null
select a,b,c,d,e,f
from table1,table3,table5
where .....
问题是,当我想添加/省略列时,我需要为每个select添加/省略列


有没有办法保存一次列列表并将其用于不同的where条件?

您可以使用动态SQL

DECLARE @sql NVARCHAR(4000)
SET @sql = '
select a,b,c,d,e,f
from table1,table3,table5
where 1=1 '

IF @name IS NOT NULL
  SET @sql = @sql + ' AND name = ' + @city
IF @age IS NOT NULL
  SET @sql = @sql + ' AND age = ' + @age
IF @city IS NOT NULL
  SET @sql = @sql + ' AND city = ' + @city


EXEC sp_executesql @sql
试试这个

SELECT -- select list here
.....
WHERE
   name= CASE WHEN @name IS NULL THEN name ELSE @name END  
   AND age= CASE WHEN @age IS NULL THEN age ELSE @age END  
   AND city= CASE WHEN @city IS NULL THEN city ELSE @city END 

谢谢你的回答,但是,这不会造成性能问题吗?那么我将无法使用编译后的查询性能?进行一些测试,但我认为这是可以忽略的。我同意@ThomasHaratyk。事实上,如此多的选择可能会让查询计划和统计数据变得疯狂。在这种情况下,动态SQL更可取,我强烈建议您避免使用旧的从a、b、c中选择。。。相反,开始使用ansi内部联接…表格集在不同的选择上是不相同的,所以我不想无缘无故地包含不同参数的表格。我的问题类似于如何在C中创建覆盖函数?参数不同但返回类型相同。不过我建议您停止使用旧的和不推荐的语法。20多年来,不鼓励使用FROM并列出表格。啊,我现在明白了。不,这不是我真正的语法,我在表之间使用内部联接,这只是为了演示我在不同的where语句中使用不同的表,select是完全相同的。如果表集已修复,这可能是一个有效的建议。