Reputation: 216
StatusId
is a comma separated string. If StatusId
is '0' then all rows should be fetched. Otherwise I need to join with temp table #StatusIdVal
and relevant records should only be fetched.
CREATE Procedure TestSchema.GetDetails
(
@StatusId Varchar(MAX)
)
As
Begin
SET NOCOUNT ON
IF OBJECT_ID('tempdb.dbo.#TempStatusVal') IS NOT NULL
BEGIN
DROP TABLE #TempStatusVal
END
Create Table #TempStatusVal (StatusId Int Primary Key)
Insert into #TempStatusVal (StatusId)
SELECT Distinct ITEMS FROM TestSchema.SPLIT(@StatusId, ',')
Select *
From TestSchema.tblDetails TD with (NoLock)
Where TD.StatusId In (Select Case When @StatusId = '0' Then TD.StatusId Else (Select StatusId From #TempStatusVal) End)
IF OBJECT_ID('tempdb.dbo.#TempStatusVal') IS NOT NULL
BEGIN
DROP TABLE #TempStatusVal
END
SET NOCOUNT OFF
End
GO
I can understand that if #TempStatusVal
have more than one records returning an exception
subquery return more than 1 value this is not permitted
How can I achieve this?
Upvotes: 0
Views: 81
Reputation: 14218
You can achieve it in this way
Select *
From TestSchema.tblDetails TD with (NoLock)
Where @StatusId = '0' or TD.StatusId In (Select t.StatusId From #TempStatusVal t)
Upvotes: 2
Reputation: 12309
You may need to WHERE
clause like this
WHERE @StatusId = '0'
OR EXISTS (SELECT 1 FROM #TempStatusVal WHERE TD.StatusId = StatusId)
Upvotes: 2
Reputation: 96
CREATE Procedure TestSchema.GetDetails
(
@StatusId Varchar(MAX)
)
As
Begin
SET NOCOUNT ON
IF OBJECT_ID('tempdb.dbo.#TempStatusVal') IS NOT NULL
BEGIN
DROP TABLE #TempStatusVal
END
Create Table #TempStatusVal (StatusId Int Primary Key)
Insert into #TempStatusVal (StatusId)
SELECT Distinct ITEMS FROM TestSchema.SPLIT(@StatusId, ',')
Select *
From TestSchema.tblDetails TD with (NoLock)
Where TD.StatusId In (
Select Case @StatusId When '0' Then TD.StatusId Else StatusId End
From #TempStatusVal
)
IF OBJECT_ID('tempdb.dbo.#TempStatusVal') IS NOT NULL
BEGIN
DROP TABLE #TempStatusVal
END
SET NOCOUNT OFF
End
GO
Upvotes: 0
Reputation: 21
Instead of making it complex add one more query to return data when @StatusId <> '0'
CREATE Procedure TestSchema.GetDetails
(
@StatusId Varchar(MAX)
)
As
Begin
SET NOCOUNT ON
IF OBJECT_ID('tempdb.dbo.#TempStatusVal') IS NOT NULL
BEGIN
DROP TABLE #TempStatusVal
END
Create Table #TempStatusVal (StatusId Int Primary Key)
Insert into #TempStatusVal (StatusId)
SELECT Distinct ITEMS FROM TestSchema.SPLIT(@StatusId, ',')
--Select *
--From TestSchema.tblDetails TD with (NoLock)
--Where TD.StatusId In (Select Case When @StatusId = '0' Then TD.StatusId Else (Select StatusId From #TempStatusVal) End)
Select TD.StatusId
From TestSchema.tblDetails TD with (NoLock)
Where @StatusId = '0'
union all
Select TD.StatusId
From #TempStatusVal TD with (NoLock)
Where @StatusId <> '0'
IF OBJECT_ID('tempdb.dbo.#TempStatusVal') IS NOT NULL
BEGIN
DROP TABLE #TempStatusVal
END
SET NOCOUNT OFF
End
GO
Upvotes: 0