How to check if a table variable is empty in SQL Server?
-
14-04-2021 - |
Question
This is a section of one of my stored procedure:
@dataInTable dbo.Table_Variable readonly,
....
AND (
( @dataInTable IS NULL )
OR
( item IN ( SELECT T FROM @dataInTable ) )
)
@dataInTable IS NULL
is wrong in syntax, error is
Must declare the scalar variable "@dataInTable"
So I change it to:
(SELECT T FROM @dataInTable) IS NULL
This works but if @dataInTable
has more than 1 item, I get an error:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Understandable, so I change it to:
(SELECT TOP(1) T FROM @ProgramRatings) IS NULL
Works perfectly, what I have is performance concern.
I am wondering, if there has an easier way to check whether a table variable is empty, like
AND (
( @dataInTable IS EMPTY )
OR
( item IN ( SELECT T FROM @dataInTable ) )
)
La solution
For check if table variable is empty, just use EXISTS as already mentioned by other people,
but
if you differ empty set from unknown set - then you have no choice - you have to introduce extra variable which states if empty set is really empty or unknown.
declare @dataInTableIsUnknown BIT
...
AND (
( @dataInTableIsUnknown = 1 )
OR
( item IN ( SELECT T FROM @dataInTable ) )
)
Autres conseils
Table variables are different from scalar variables so @dataInTable IS NULL
is not allowed as you mentioned. I would suggest the following:
EXISTS (SELECT 1 FROM @dataInTable)
The following also may make sense for your situation if you actually care to know the count:
DECLARE @dataCount int = (SELECT COUNT(1) FROM @dataInTable)
IF @dataCount = 0 -- Empty
There's always exists
.
For example:
select 'Yep'
where exists (select 1 from @dataInTable)