2017-06-14 625 views
0

以下是我的存儲過程。如何在sql查詢的where子句中使用if else

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 >[email protected] and U.ModifiedDate<= @EndDate 
END 

其中如果@StartDate和@EndDate參數爲null,那麼我想刪除條件。

如果@StartDate和@EndDate參數存在然後應用條件那麼我該怎麼做?

+0

你是說如果有開始日期,應該有一個結束日期,否則沒有日期? – maSTAShuFu

回答

1

你可以只修改WHERE條件:

where @StartDate IS NULL OR @EndDate IS NULL OR 
     U.ModifiedDate BETWEEN @StartDate AND @EndDate 

爲了防止parameter sniffing(用於不同的參數值,一個緩存的執行計劃),我建議你在程序(WITH RECOMPILE)或查詢級別使用重新編譯提示。 OPTION (RECOMPILE);

+1

..只是在這種'可選的情況'的情況下知道參數嗅探。 –

0
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 and @EndDate <> '')set @sql += 'where U.ModifiedDate 
>=''[email protected]+'' and U.ModifiedDate<= ''[email protected]''' 
exec(@sql) 
END 
+0

它給2錯誤。 第17行: - ','附近語法不正確。 和 第49行:在期望條件的上下文中指定的非布爾類型的表達式,在'和'附近。 – sbm6070

0
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 
INTO #NEW_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 #NEW_TABLE 
    where ModifiedDate >[email protected] and ModifiedDate<= @EndDate 
ELSE 
    SELECT * FROM #NEW_TABLE 
END 
+0

它說的是 數據庫中已經有一個名爲'TEMP_TABLE'的對象。 – sbm6070

+0

您可以嘗試根據您的偏好更改表格的名稱。 – user8158485

+0

它現在正常工作 – sbm6070

0

試試這個....

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 >='''[email protected]+''' and U.ModifiedDate<= '''[email protected]+'''' 

exec(@sql) 
END 
0

我只是檢查之前調用存儲過程「TEMP_DATA_TABLE」是否爲空或不是,如果它不爲空,然後丟棄表。它的工作原理。

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 >[email protected] and ModifiedDate<= @EndDate 
ELSE 
    SELECT * FROM TEMP_DATA_TABLE 
END