2008-10-04 8 views
41

¿Cómo configuro una variable para el resultado de la consulta de selección sin utilizar un procedimiento almacenado?SQL Server 2005 Establecer una variable para el resultado de una consulta de selección


quiero hacer algo como: OOdate DATETIME

SET OOdate = Select OO.Date 
FROM OLAP.OutageHours as OO 
WHERE OO.OutageID = 1 

Entonces quiero usar OOdate en esta consulta:

SELECT COUNT(FF.HALID) from Outages.FaultsInOutages as OFIO 
INNER join Faults.Faults as FF ON FF.HALID = OFIO.HALID 
WHERE CONVERT(VARCHAR(10),OO.Date,126) = CONVERT(VARCHAR(10),FF.FaultDate,126)) 
AND 
OFIO.OutageID = 1 

Respuesta

1

¿Qué quiere decir exactamente? ¿Desea reutilizar el resultado de su consulta para otra consulta?

En ese caso, ¿por qué no combinar ambas preguntas, haciendo que la segunda consulta de búsqueda dentro de los resultados de la primera (SELECT xxx in (SELECT yyy...)

3

que puede usar:

declare @foo as nvarchar(25) 

select @foo = 'bar' 

select @foo 
67

se puede usar algo como

SET @cnt = (SELECT COUNT(*) FROM User) 

o

SELECT @cnt = (COUNT(*) FROM User) 

Para que esto funcione, SELECT debe devolver una sola columna y un solo resultado y la instrucción SELECT debe estar entre paréntesis.

Editar: ¿Has probado algo como esto?

DECLARE @OOdate DATETIME 

SET @OOdate = Select OO.Date from OLAP.OutageHours as OO where OO.OutageID = 1 

Select COUNT(FF.HALID) 
from Outages.FaultsInOutages as OFIO 
inner join Faults.Faults as FF 
    ON FF.HALID = OFIO.HALID 
WHERE @OODate = FF.FaultDate 
    AND OFIO.OutageID = 1 
+6

por primera ejemplo que proporcionó, debe envolver el "conteo de selección (*) del usuario" entre paréntesis o sql 2008 se mostrará con una línea roja ondulada. ¡Gracias por proporcionar dos ejemplos de sintaxis! – TWood

2

También podría simplemente colocar el primer SELECT en una sub consulta. Dado que la mayoría de los optimizadores lo doblarán en una constante de todos modos, no debería haber un golpe de rendimiento en esto.

Por cierto, dado que está utilizando un predicado como esto:

CONVERT(...) = CONVERT(...) 

ese predicado expresión no puede ser optimizado correctamente o el uso de índices en la referencia de columnas por la función CONVERT().

Aquí es una manera de hacer la consulta original algo mejor:

DECLARE @ooDate datetime 
SELECT @ooDate = OO.Date FROM OLAP.OutageHours AS OO where OO.OutageID = 1 

SELECT 
    COUNT(FF.HALID) 
FROM 
    Outages.FaultsInOutages AS OFIO 
    INNER JOIN Faults.Faults as FF ON 
    FF.HALID = OFIO.HALID 
WHERE 
    FF.FaultDate >= @ooDate AND 
    FF.FaultDate < DATEADD(day, 1, @ooDate) AND 
    OFIO.OutageID = 1 

Esta versión podría aprovechar en el índice que involucró FaultDate, y logra el mismo objetivo.

Aquí está, reescrito para usar una subconsulta para evitar la declaración de la variable y SELECT subsiguiente.

SELECT 
    COUNT(FF.HALID) 
FROM 
    Outages.FaultsInOutages AS OFIO 
    INNER JOIN Faults.Faults as FF ON 
    FF.HALID = OFIO.HALID 
WHERE 
    CONVERT(varchar(10), FF.FaultDate, 126) = (SELECT CONVERT(varchar(10), OO.Date, 126) FROM OLAP.OutageHours AS OO where OO.OutageID = 1) AND 
    OFIO.OutageID = 1 

Tenga en cuenta que este enfoque tiene el mismo problema el uso de índices como el original, debido a la utilización de CONVERT() en FF.FaultDate. Esto podría remediarse agregando la subconsulta dos veces, pero en este caso estaría mejor atendido con el enfoque variable. Esta última versión es solo para demostración.

Atentamente.

+0

votación para 'SELECT (at) ooDate = OO.Date DE OLAP.OutageHours AS OO donde OO.OutageID = 1' 'SET (at) ooDate = SELECCIONAR OO.Date DE OLAP.OutageHours AS OO donde OO. OutageID = 1 'no funciona con VARCHAR, etc. Disculpe la (at), la colocación del símbolo real es interpretada por SO como el etiquetado de un usuario – Inversus

13

- SQL Server Management Studio 2005

 

use Master 
go 
DECLARE @MyVar bigint 
SET @myvar = (SELECT count(*) FROM spt_values); 
SELECT @myvar 
 
Result: 2346 (in my db) 

- Nota: @myvar = @Myvar

2

Esto funcionará para pregunta original se le preguntó:

DECLARE @Result INT; 
SELECT @Result = COUNT(*) 
FROM TableName 
WHERE Condition 
Cuestiones relacionadas