2012-01-05 73 views
8

Esta es una sección de uno de mi procedimiento almacenado:¿Cómo comprobar si una variable de tabla está vacía en SQL Server?

@dataInTable dbo.Table_Variable readonly, 
.... 

AND (
    (@dataInTable IS NULL) 
    OR 
    (item IN (SELECT T FROM @dataInTable)) 
) 

@dataInTable IS NULL está mal en la sintaxis, el error es

Must declare the scalar variable "@dataInTable"

Así lo cambio a:

(SELECT T FROM @dataInTable) IS NULL 

Estos trabajos pero si @dataInTable tiene más de 1 artículo, recibo un error:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

comprensible, por lo que cambiar a:

(SELECT TOP(1) T FROM @ProgramRatings) IS NULL 

funciona perfectamente, lo que tengo es la preocupación rendimiento.

Me pregunto, si no tiene una forma más fácil de comprobar si una variable tabla está vacía, como

AND (
    (@dataInTable IS EMPTY) 
    OR 
    (item IN (SELECT T FROM @dataInTable)) 
) 

Respuesta

5

Para la comprobación si la variable tabla está vacía, sólo tiene que utilizar existe como ya se ha dicho por otras personas,

pero

si difieren conjunto vacío desde desconocida establecer - entonces no tiene elección - tiene que introducir una variable adicional que indica si el conjunto vacío está realmente vacío o desconocido.

declare @dataInTableIsUnknown BIT 

... 

AND (
    (@dataInTableIsUnknown = 1) 
    OR 
    (item IN (SELECT T FROM @dataInTable)) 
) 
21

variables de tabla son diferentes de las variables escalares por lo @dataInTable IS NULL no se permite como usted ha mencionado. Yo sugeriría lo siguiente:

EXISTS (SELECT 1 FROM @dataInTable) 

Lo siguiente también puede tener sentido para su situación si realmente importa saber el conteo:

DECLARE @dataCount int = (SELECT COUNT(1) FROM @dataInTable) 
IF @dataCount = 0 -- Empty 
11

Siempre hay exists.

Por ejemplo:

select 'Yep' 
where exists (select 1 from @dataInTable) 
+4

+1 'EXISTS' puede ser más eficiente que' COUNT' ya que se detiene después de la primera fila. –

+0

Gracias, traté de existir pero no se puede usar dentro de una condición de selección: AND ( (NO PUEDO COLOCAR Existe AQUÍ) O (elemento IN (SELECCIONE T DE @dataInTable)) ). ¿Conoces la sintaxis correcta? –

+1

@EricYin Probablemente estés buscando 'CASE' si quieres usarlo en' SELECT'. Es difícil saber lo que está haciendo en función de los fragmentos que ha publicado hasta ahora. –

Cuestiones relacionadas