基于参数的评估,使用不同的参数运行相同的查询

时间:2017-09-21 17:27:02

标签: tsql

我有一个包含几个参数的查询。

如果另一组参数为null,我需要使用一组参数运行查询。

有没有其他方法可以在不重复条件中的语句的情况下执行此操作?

例如:

USE MYDataBase;
GO

DECLARE @Argument1 VARCHAR = 1234;
DECLARE @Argument2 VARCHAR = 'HELLO WORLD';

IF @Argument1 IS NULL

SELECT * FROM MyTable 
WHERE ColumnValue = @Argument1

ELSE

SELECT * FROM MyTable 
WHERE ColumnValue = @Argument2

除了上面的方法之外还有其他方法可以运行它,并将查询放在proc中并在另一个语句的evaluate子句中调用proc吗?

2 个答案:

答案 0 :(得分:0)

您可以使用合并:

USE MYDataBase;
GO

DECLARE @Argument1 VARCHAR = 1234;
DECLARE @Argument2 VARCHAR = 'HELLO WORLD';

SELECT * FROM MyTable 
WHERE ColumnValue = coalesce(@Argument1, @Argument2)

Coalesce将返回您提供的第一个非null参数 - 如果所有参数都为null,则返回null。

答案 1 :(得分:0)

当你开始变得非常复杂时,就像5种或更多种可能性一样,我通常会使用动态语句。

create Table DynamicExample (DynamicExampleId int identity, Dsc varchar(32), Memo varchar(512), Memo2 varchar(512))
insert into DynamicExample values ('test', 'Memo', 'Memo2'),('test2', 'Memo 2', 'Memo2 2')

Declare @SQL Nvarchar(512) = 'select * from DynamicExample'

Declare @param nvarchar (128) = ' where {column} = {value}'
declare @column nvarchar(64) = 'DynamicExampleId'
declare @value nvarchar(64) = '2'

Select @param = Replace(@param, '{column}', @column);
Select @param = Replace(@param, '{value}', @value);

Select @SQL += @param

exec sp_executesql @SQL

这样做的好处是你没有这样做:

if,else,if,else,if,else,if,else,if,else,if,else等。你实际上在说:“如果我有谓词确定它们是什么以及它们的值。”现在说这个,如果你有多个谓词,你可以很容易地扩展一个检查,看看它是第一个谓词还是多于第一个谓词,并用'和'而不是'where'扩展更多。