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
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
- 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
Vous pouvez utiliser:
declare @foo as nvarchar(25)
select @foo = 'bar'
select @foo
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.
Cela fonctionnera pour la question d'origine posée:
DECLARE @Result INT;
SELECT @Result = COUNT(*)
FROM TableName
WHERE Condition
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...)