¿Cómo puedo configurar una variable el resultado de una consulta de selección sin necesidad de utilizar un procedimiento almacenado?


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
InformationsquelleAutor test | 2008-10-04

6 Comentarios

  1. 69

    Usted puede usar algo como

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

    o

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

    Para que esto funcione la SELECCIONE debe devolver una columna y un resultado único 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
    • para el primer ejemplo que siempre deberá ajustar el «select count(*) from usuario» en el paréntesis o sql 2008 a un contador con una línea roja ondulada. Gracias por dar dos ejemplos de sintaxis, aunque!
  2. 13

    : Sql Server 2005 Management studio

    
    use Master
    go
    DECLARE @MyVar bigint
    SET @myvar = (SELECT count(*) FROM spt_values);
    SELECT @myvar
     
    Resultado: 2346 (en mi db)

    Nota: @myvar = @Myvar

  3. 2

    También se puede simplemente poner la primera selección en una subconsulta. Dado que la mayoría de los optimizadores se pliega en una constante de todos modos, no debería haber un impacto en el rendimiento de este.

    Por cierto, ya que usted está usando un predicado como este:

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

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

    Aquí es una forma 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 participan FaultDate, y logra el mismo objetivo.

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

    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 índice de problema de uso como la original, porque el uso de CONVERT() en FF.FaultDate. Esto se podría solucionar mediante la adición de la subconsulta dos veces, pero estaría mejor servido con la variable de enfoque en este caso. Esta última versión es sólo para fines de demostración.

    Se refiere.

    • Votaron para ‘SELECCIONAR (a)ooDate = OO.Fecha DE OLAP.OutageHours COMO OO donde OO.OutageID = 1’ ‘SET (a)ooDate = SELECCIONE OO.Fecha DE OLAP.OutageHours COMO OO donde OO.OutageID = 1’ no funciona con VARCHAR, etc Excusa de la (a), colocando el verdadero símbolo es interpretado por ASÍ como etiquetar a un usuario
  4. 1

    ¿A qué te refieres exactamente? ¿Desea volver a utilizar el resultado de su consulta para otra consulta?

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

Dejar respuesta

Please enter your comment!
Please enter your name here