web-dev-qa-db-fra.com

SQL Server 2005 Définition d'une variable sur le résultat d'une requête de sélection

Comment définir une variable sur le résultat de la requête de sélection sans utiliser de procédure stockée?


Je veux faire quelque chose comme: OOdate DATETIME

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

Ensuite, je veux utiliser OOdate dans cette requête:

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
43
test

Vous pouvez utiliser quelque chose comme

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

ou

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

Pour que cela fonctionne, SELECT doit renvoyer une seule colonne et un seul résultat et l'instruction SELECT doit être entre parenthèses.

Edit: Avez-vous essayé quelque chose comme ça?

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
69
rslite

- Sql Server 2005 Management studio


use Master
go
DECLARE @MyVar bigint
SET @myvar = (SELECT count(*) FROM spt_values);
SELECT @myvar
 
 Résultat: 2346 (dans ma base de données) 

Remarque: @myvar = @Myvar

13
Allisson Pereira

Vous pouvez utiliser:

declare @foo as nvarchar(25)

select @foo = 'bar'

select @foo
3
JPrescottSanders

Vous pouvez également simplement placer le premier SELECT dans une sous-requête. Étant donné que la plupart des optimiseurs le plieront de toute façon, il ne devrait y avoir aucun impact sur les performances.

Incidemment, puisque vous utilisez un prédicat comme celui-ci:

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

cette expression de prédicat ne peut pas être optimisée correctement ou utiliser des index sur la référence de colonnes par la fonction CONVERT ().

Voici une façon d'améliorer quelque peu la requête d'origine:

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

Cette version pourrait tirer parti de l'index impliquant FaultDate et atteindre le même objectif.

Le voici, réécrit pour utiliser une sous-requête pour éviter la déclaration de variable et SELECT suivant.

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

Notez que cette approche a le même problème d'utilisation d'index que l'original, en raison de l'utilisation de CONVERT () sur FF.FaultDate. Cela pourrait être résolu en ajoutant deux fois la sous-requête, mais vous seriez mieux servi avec l'approche variable dans ce cas. Cette dernière version est uniquement à titre de démonstration.

Cordialement.

2
Pittsburgh DBA

Cela fonctionnera pour la question d'origine posée:

DECLARE @Result INT;
SELECT @Result = COUNT(*)
FROM  TableName
WHERE Condition
2
Siddhesh Bondre

Que voulez-vous dire exactement? Voulez-vous réutiliser le résultat de votre requête pour une autre requête?

Dans ce cas, pourquoi ne pas combiner les deux requêtes, en effectuant la deuxième recherche dans les résultats de la première (SELECT xxx in (SELECT yyy...)

1
Luk