2016-08-27 6 views
-1

Ich habe zwei Felder (@ EmployeeId, @ SSOId), aus dem ein Wert kommen kann oder beide kommen, aber wenn ich mich bewerbe oder der Zustand es nicht gibt mir korrekte Ausgabe. Was mache ich falsch?SQL WEDER AUF ZWEI SÄULEN

ALTER PROCEDURE [dbo].[usp_User_GetDetails] ( 
@UserId INT = NULL 
,@ADSId NVARCHAR(32) = NULL 
,@EmployeeId NVARCHAR(32) = NULL 
,@SSOId NVARCHAR(32) = NULL 
,@UserName NVARCHAR(100) = NULL 
) 
AS 

*/ 
SET NOCOUNT ON; 
BEGIN 
SELECT [USER_ID] AS UserId 
,[FIRST_NM] AS FirstName 
,[LST_NM] AS LastName 
,[FULL_NM] AS FullName 
,[ADS_USER_ID] AS ADSId 
,[SEG_ID] AS SegmentId 
,[PHONE_NO] AS PhoneNo 
,[FAX_NO] AS FaxNo 
,[EMP_ID] AS EmployeeId 
,[EMAIL_AD_TX] AS Email 
,[SSO_ID] AS SSOId 
,[SFDC_IN] AS IsSFDC 
,[USER_SFDC_ID] AS UserSFDCId 
,[MGR_SFDC_ID] AS ManagerSFDCId 
,[ACT_IN] AS IsActive 
,[SYS_USER_IN] AS IsSystemUser 
,[PORFOLIO_OWN_IN] AS CanHavePortfolio 
,[MGR_ID] AS ManagerId 
,[LST_LOG_IN_TS] AS LastLoginDate 
,[EMP_BAND_TX] AS Band 
,[CREAT_TS] AS CreatedDate 
,[CREAT_BY_USER_ID] AS CreatedBy 
,[LST_UPDT_TS] AS UpdatedDate 
,[LST_UPDT_BY_USER_ID] AS UpdatedBy 
FROM [dbo].[USER] WITH (NOLOCK) 
WHERE ([EMP_ID] = ISNULL(@EmployeeId, [EMP_ID])OR [SSO_ID] = ISNULL(@SSOId, [SSO_ID]) 
AND [ADS_USER_ID] = ISNULL(@ADSId, [ADS_USER_ID]) 
AND [USER_ID] = ISNULL(@UserId, [USER_ID]) 
AND [FULL_NM] LIKE CASE 
WHEN @UserName IS NOT NULL 
THEN '%' + @UserName + '%' 
ELSE [FULL_NM] 
END 
END 
+0

Sind diese beiden Variablen die gleiche Art? – Mihai

+0

Ja Mihai ...... – user662285

+0

Ich schlage vor, Sie brechen diese auf einen kleinen Fall nach unten die Daten fehlschlägt. Parens stimmen nicht überein. – Paparazzi

Antwort

0

Abfrage scheint alles in Ordnung .Sind vorbei DBNull von Ihnen C# -Code oder leeren Text

+0

DBNull ........... – user662285

2

Ich glaube nicht zu sein sind die Klammern richtig ausgewogen. Auf jeden Fall würde ich dies schreibe, ohne die ISNULL():

WHERE ((@EmployeeId IS NULL OR EMP_ID = @EmployeeId) OR 
     (@SSOId IS NULL OR SSO_ID = @SSOId) 
    ) AND 
     (@ADSId IS NULL OR ADS_USER_ID = @ADSId) AND 
     (@UserId IS NULL OR USER_ID = @UserId) AND 
     (@UserName IS NULL OR FULL_NM LIKE '%' + @UserName + '%') 

Ich vermute, dass die OR für die ersten beiden Bedingungen ist. Hier scheinen sich die Parens nicht in der Abfrage in der Frage zu befinden.

Ich ziehe dieses Konstrukt aus zwei Gründen. Zuerst behandelt sie NULL Werte in der Spalte sowie die Parameterwerte Werte. Und zweitens - weil es allgemeiner ist - ist es eine der zwei Standardarten, die ich verwende, um optionale Parameter zu handhaben (die andere besteht darin, dynamisches SQL zu verwenden, das Indizes verwenden kann).

+0

Problem ... wenn ich gespeicherte Prozedur Exec es alle Zeilen geben statt einer ... EXEC [usp_User_GetDetails] @EmployeeID = ‚8123154‘ – user662285

0
WHERE (@EmployeeId IS NULL OR (EMP_ID = @EmployeeId)) 
AND (@SSOId IS NULL OR (SSO_ID = @SSOId)) 
AND [ADS_USER_ID] = ISNULL(@ADSId, [ADS_USER_ID]) 
AND [USER_ID] = ISNULL(@UserId, [USER_ID]) 
AND [FULL_NM] LIKE CASE 
WHEN @UserName IS NOT NULL 
THEN '%' + @UserName + '%' 
ELSE [FULL_NM] 
0

dieses Skript Gebrauchte

WHERE EMP_ID = CASE WHEN ISNULL (@ EmployeeId, 0)> 0 THEN ELSE EMP_ID END @EmployeeID UND SSO_ID = CASE WHEN ISNULL (@ SSOId, 0)> 0 THEN @ SSOId ELSE SSO_ID END

Verwandte Themen