Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 根据是否已设置参数查找行值_Sql Server_Parameters - Fatal编程技术网

Sql server 根据是否已设置参数查找行值

Sql server 根据是否已设置参数查找行值,sql-server,parameters,Sql Server,Parameters,我有一个存储过程,它有两个参数:@Name和@姓氏,必须由外部源设置 我需要存储过程根据设置的参数返回值。它应该忽略空参数,只考虑设置参数 SELECT * FROM ParticipantNames WHERE -- The if below should go here... if(@Name iS NOT NULL) - find the row whose [NAME] column LIKE @Name else skip name comparison. if(@Surnam

我有一个存储过程,它有两个参数:@Name和@姓氏,必须由外部源设置

我需要存储过程根据设置的参数返回值。它应该忽略空参数,只考虑设置参数

SELECT * 
FROM ParticipantNames
WHERE --  The if below should go here... 

if(@Name iS NOT NULL) - find the row whose [NAME] column LIKE @Name else skip name comparison.
if(@Surname iS NOT NULL) - find the row whose [SURNAME] column LIKE @Surname else skip surname comparison.
if(@Name AND @Surname is NOT NULL) - find the row whose [NAME] column LIKE @Name AND whose [SURNAME] column LIKE @Surname
如果已设置所有参数,但未设置一个参数时返回0行,则以下操作有效

;WITH tempSearch AS
(
    SELECT *
    FROM ParticipantNames f
    WHERE ((f.Name LIKE CASE WHEN @Name IS NULL THEN NULL ELSE @Name END)
      AND (f.Surname LIKE CASE WHEN @Surname IS NULL THEN NULL ELSE @Surname END)
...
我知道由于AND子句,它返回0行,但我不知道如何修复它


关于如何实现这一点,您有什么建议吗?

您似乎试图在查询中使用“默认”模式

这里的问题是在WHEN的情况下投影NULL,这将导致WHERE列,比如NULL,这将不起作用

您可以做的是重新替换实际列,如下所示:

SELECT *
FROM ParticipantNames f
WHERE ((f.Name LIKE CASE WHEN @Name IS NULL THEN Name ELSE @Name END)
  AND (f.Surname LIKE CASE WHEN @Surname IS NULL THEN Surname ELSE @Surname END)
这将导致在默认情况下出现类似列的列,这将起作用


但是请注意,由于谓词的条件使用,这样的查询在查询优化器上很难实现。关于如何最好地处理“可选参数”的应用,有很多建议。

f.Name喜欢什么isnull@Name,“%”和f。类似姓氏isnull@Surname“%”很有魅力!如果您使用的是更高级的语言来进行查询,那么最好首先消除“不需要的”WHERE谓词,而不是使用像这样的hack或ISNULL