ストアドプロシージャを使用せずに、選択クエリの結果に変数を設定するにはどうすればよいですか?
私は次のようなことをしたい:OOdate DATETIME
SET OOdate = Select OO.Date
FROM OLAP.OutageHours as OO
WHERE OO.OutageID = 1
次に、このクエリでOOdateを使用します。
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
次のようなものを使用できます
SET @cnt = (SELECT COUNT(*) FROM User)
または
SELECT @cnt = (COUNT(*) FROM User)
これが機能するには、SELECTが単一の列と単一の結果を返す必要があり、SELECTステートメントが括弧で囲まれている必要があります。
編集:このようなことを試しましたか?
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管理スタジオ
use Master
go
DECLARE @MyVar bigint
SET @myvar = (SELECT count(*) FROM spt_values);
SELECT @myvar
結果:2346(私のデータベース内)
- 注意: @myvar = @Myvar
次を使用できます。
declare @foo as nvarchar(25)
select @foo = 'bar'
select @foo
また、最初のSELECTをサブクエリに入れることもできます。とにかく、ほとんどのオプティマイザーは定数にそれを折りたたむので、これがパフォーマンスに影響することはありません。
ちなみに、次のような述語を使用しているため:
CONVERT(...) = CONVERT(...)
その述語式は適切に最適化できないか、CONVERT()関数によって参照される列のインデックスを使用できません。
元のクエリを多少改善する1つの方法を次に示します。
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
このバージョンは、FaultDateを含むインデックスで活用でき、同じ目標を達成します。
ここでは、サブクエリを使用して変数宣言と後続のSELECTを回避するように書き直されています。
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
このアプローチには、FF.FaultDateでCONVERT()を使用するため、元のインデックスと同じインデックス使用の問題があることに注意してください。これは、サブクエリを2回追加することで解決できますが、この場合は変数アプローチを使用する方が適切です。この最後のバージョンはデモ用です。
よろしく。
これは、元の質問に対して機能します:
DECLARE @Result INT;
SELECT @Result = COUNT(*)
FROM TableName
WHERE Condition
どういう意味?クエリの結果を他のクエリに再利用しますか?
その場合、最初のクエリの結果内で2番目のクエリを検索して、両方のクエリを組み合わせてみませんか(SELECT xxx in (SELECT yyy...)