如何在sql查询的where子句中使用If-else

如何在sql查询的where子句中使用If-else,sql,sql-server,stored-procedures,sql-query-store,Sql,Sql Server,Stored Procedures,Sql Query Store,下面是我的存储过程 USE [CBRDev] GO /****** Object: StoredProcedure [dbo].[usp_ExportData] Script Date: 6/14/2017 12:48:44 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER procedure [dbo].[usp_ExportData] ( @StartDate Date, @EndDate Date )

下面是我的存储过程

USE [CBRDev]
GO
/****** Object:  StoredProcedure [dbo].[usp_ExportData]    Script Date: 6/14/2017 12:48:44 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[usp_ExportData]
(
@StartDate Date,
@EndDate Date
)

AS
BEGIN
 Select REPLACE(U.EmployeeID, ',','') as EmployeeID,REPLACE(U.ClientID, ',','') as ClientID,REPLACE(U.ID, ',','') as ID,
 REPLACE(U.FirstName, ',','')as FirstName,REPLACE(U.MiddleName, ',','')as MiddleName,
 REPLACE(U.LastName, ',','')as LastName,REPLACE(U.Email, ',','')as Email,REPLACE(U.SSN, ',','')as SSN,
 REPLACE(U.DateOfBirth, ',','')as DateOfBirth,REPLACE(U.Gender, ',','')as Gender,REPLACE(U.CreatedDate, ',','')as CreatedDate,
REPLACE(U.ModifiedDate, ',','')as ModifiedDate, REPLACE(UPI.StreetAddress1, ',','')as StreetAddress1,
REPLACE(UPI.StreetAddress2, ',','')as StreetAddress2,REPLACE(UPI.City, ',','')as City,
REPLACE(UPI.State, ',','')as State,
REPLACE(UPI.ZipCode, ',','')as ZipCode,
REPLACE(UPI.CellPhoneNumber, ',','')as CellPhoneNumber, '' as Department, '' as JobTitle, '' as StreetAddress3 from Users U INNER JOIN PersonalContacts UPI ON U.ID= UPI.UserID
 where U.ModifiedDate >=@StartDate and U.ModifiedDate<= @EndDate
END
其中,如果@StartDate和@EndDate参数为null,则我希望删除where条件


如果@StartDate和@EndDate参数存在,那么应用where条件,那么我该怎么做?

您可以修改where条件:

where @StartDate IS NULL OR @EndDate IS NULL OR 
      U.ModifiedDate BETWEEN @StartDate AND @EndDate
为了防止一个缓存的执行计划用于不同的参数值,我建议您在具有重新编译或查询级别的过程上使用重新编译提示。选项重新编译

试试这个

ALTER procedure [dbo].[usp_ExportData]
(
@StartDate Date,
@EndDate Date
)
AS
BEGIN
declare @sql varchar(max)
set @sql = ''
set @sql += ' Select REPLACE(U.EmployeeID, '','','') as 
EmployeeID,REPLACE(U.ClientID, '','','') as ClientID,REPLACE(U.ID, '','','') as ID,
REPLACE(U.FirstName, '','','')as FirstName,REPLACE(U.MiddleName, '','','')as MiddleName,
REPLACE(U.LastName, '','','')as LastName,REPLACE(U.Email, ',','')as 
Email,REPLACE(U.SSN, '','','')as SSN,
REPLACE(U.DateOfBirth, '','','')as DateOfBirth,REPLACE(U.Gender, '','','')as
Gender,REPLACE(U.CreatedDate, '','','')as CreatedDate,
REPLACE(U.ModifiedDate, '','','')as ModifiedDate, REPLACE(UPI.StreetAddress1,
 '','','')as StreetAddress1,
REPLACE(UPI.StreetAddress2, '','','')as StreetAddress2,REPLACE(UPI.City, '','','')as
 City,
REPLACE(UPI.State, '','','')as State,
REPLACE(UPI.ZipCode, '','','')as ZipCode,
REPLACE(UPI.CellPhoneNumber, '','','')as CellPhoneNumber, '' as Department, '' as 
JobTitle, '' as StreetAddress3 from Users U INNER JOIN PersonalContacts UPI ON
 U.ID= UPI.UserID'

if(@StartDate <> '' or @EndDate <> '')set @sql += ' where U.ModifiedDate >='''+@StartDate+''' and U.ModifiedDate<= '''+@EndDate+''''

exec(@sql)
END

我只是在调用存储过程之前检查“TEMP_DATA_TABLE”是否为null,如果不是null,则删除该表。它是有效的

USE [CBRDev]    
GO  
/****** Object:  StoredProcedure [dbo].[usp_ExportData] Script Date: 
6/14/2017 12:48:44 PM ******/
SET ANSI_NULLS ON  
GO  
SET QUOTED_IDENTIFIER ON  
GO  
ALTER procedure [dbo].[usp_ExportData]  
(
   @StartDate Date,
   @EndDate Date  
)

AS
BEGIN

if (select OBJECT_ID('TEMP_DATA_TABLE')) Is Not Null
Begin 
DROP Table TEMP_DATA_TABLE
end
Select REPLACE(U.EmployeeID, ',','') as EmployeeID,
REPLACE(U.ClientID, ',','') as ClientID, 
REPLACE(U.ID, ',','') as ID, REPLACE(U.FirstName, ',','')as FirstName, 
REPLACE(U.MiddleName, ',','')as MiddleName,
REPLACE(U.LastName, ',','')as LastName,
REPLACE(U.Email, ',','')as Email,REPLACE(U.SSN, ',','')as SSN,
REPLACE(U.DateOfBirth, ',','')as DateOfBirth,
REPLACE(U.Gender, ',','')as Gender,
REPLACE(U.CreatedDate, ',','')as CreatedDate,
REPLACE(U.ModifiedDate, ',','')as ModifiedDate, 
REPLACE(UPI.StreetAddress1, ',','')as StreetAddress1,
REPLACE(UPI.StreetAddress2, ',','')as StreetAddress2,
REPLACE(UPI.City, ',','')as City,
REPLACE(UPI.State, ',','')as State,
REPLACE(UPI.ZipCode, ',','')as ZipCode,
REPLACE(UPI.CellPhoneNumber, ',','')as CellPhoneNumber, '' as Department, '' 
as JobTitle, '' as StreetAddress3   
INTO TEMP_DATA_TABLE   
FROM Users U INNER JOIN PersonalContacts UPI ON U.ID= UPI.UserID  

IF (@StartDate IS NOT NULL AND @EndDate IS NOT NULL)  
  SELECT * FROM TEMP_DATA_TABLE 
  where ModifiedDate >=@StartDate and ModifiedDate<= @EndDate   
ELSE  
  SELECT * FROM TEMP_DATA_TABLE  
END

.. 注意在这种“可选where”情况下的参数嗅探。你是说如果有开始日期,就应该有结束日期,否则就没有日期?它给出了2个错误。第17行:“,”附近的语法不正确。第49行:-在预期条件的上下文中指定的非布尔型表达式,“和”附近。它表示数据库中已经有一个名为“TEMP_TABLE”的对象。您可以尝试根据自己的首选项更改表的名称。我的方法是将其存储在临时表NEW_TABLE中,然后根据指定的条件筛选此表。希望它能起作用:@user8158485这是一种懒惰且低效的方法。正确实现的动态sql设计更好-请参阅
ALTER procedure [dbo].[usp_ExportData]
(
@StartDate Date,
@EndDate Date
)
AS
BEGIN
declare @sql varchar(max)
set @sql = ''
set @sql += ' Select REPLACE(U.EmployeeID, '','','') as 
EmployeeID,REPLACE(U.ClientID, '','','') as ClientID,REPLACE(U.ID, '','','') as ID,
REPLACE(U.FirstName, '','','')as FirstName,REPLACE(U.MiddleName, '','','')as MiddleName,
REPLACE(U.LastName, '','','')as LastName,REPLACE(U.Email, ',','')as 
Email,REPLACE(U.SSN, '','','')as SSN,
REPLACE(U.DateOfBirth, '','','')as DateOfBirth,REPLACE(U.Gender, '','','')as
Gender,REPLACE(U.CreatedDate, '','','')as CreatedDate,
REPLACE(U.ModifiedDate, '','','')as ModifiedDate, REPLACE(UPI.StreetAddress1,
 '','','')as StreetAddress1,
REPLACE(UPI.StreetAddress2, '','','')as StreetAddress2,REPLACE(UPI.City, '','','')as
 City,
REPLACE(UPI.State, '','','')as State,
REPLACE(UPI.ZipCode, '','','')as ZipCode,
REPLACE(UPI.CellPhoneNumber, '','','')as CellPhoneNumber, '' as Department, '' as 
JobTitle, '' as StreetAddress3 from Users U INNER JOIN PersonalContacts UPI ON
 U.ID= UPI.UserID'

if(@StartDate <> '' or @EndDate <> '')set @sql += ' where U.ModifiedDate >='''+@StartDate+''' and U.ModifiedDate<= '''+@EndDate+''''

exec(@sql)
END
USE [CBRDev]    
GO  
/****** Object:  StoredProcedure [dbo].[usp_ExportData] Script Date: 
6/14/2017 12:48:44 PM ******/
SET ANSI_NULLS ON  
GO  
SET QUOTED_IDENTIFIER ON  
GO  
ALTER procedure [dbo].[usp_ExportData]  
(
   @StartDate Date,
   @EndDate Date  
)

AS
BEGIN

if (select OBJECT_ID('TEMP_DATA_TABLE')) Is Not Null
Begin 
DROP Table TEMP_DATA_TABLE
end
Select REPLACE(U.EmployeeID, ',','') as EmployeeID,
REPLACE(U.ClientID, ',','') as ClientID, 
REPLACE(U.ID, ',','') as ID, REPLACE(U.FirstName, ',','')as FirstName, 
REPLACE(U.MiddleName, ',','')as MiddleName,
REPLACE(U.LastName, ',','')as LastName,
REPLACE(U.Email, ',','')as Email,REPLACE(U.SSN, ',','')as SSN,
REPLACE(U.DateOfBirth, ',','')as DateOfBirth,
REPLACE(U.Gender, ',','')as Gender,
REPLACE(U.CreatedDate, ',','')as CreatedDate,
REPLACE(U.ModifiedDate, ',','')as ModifiedDate, 
REPLACE(UPI.StreetAddress1, ',','')as StreetAddress1,
REPLACE(UPI.StreetAddress2, ',','')as StreetAddress2,
REPLACE(UPI.City, ',','')as City,
REPLACE(UPI.State, ',','')as State,
REPLACE(UPI.ZipCode, ',','')as ZipCode,
REPLACE(UPI.CellPhoneNumber, ',','')as CellPhoneNumber, '' as Department, '' 
as JobTitle, '' as StreetAddress3   
INTO TEMP_DATA_TABLE   
FROM Users U INNER JOIN PersonalContacts UPI ON U.ID= UPI.UserID  

IF (@StartDate IS NOT NULL AND @EndDate IS NOT NULL)  
  SELECT * FROM TEMP_DATA_TABLE 
  where ModifiedDate >=@StartDate and ModifiedDate<= @EndDate   
ELSE  
  SELECT * FROM TEMP_DATA_TABLE  
END