web-dev-qa-db-ja.com

SQL Server 2005選択クエリの結果への変数の設定

ストアドプロシージャを使用せずに、選択クエリの結果に変数を設定するにはどうすればよいですか?


私は次のようなことをしたい: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
43
test

次のようなものを使用できます

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

-SQL Server 2005管理スタジオ


use Master
go
DECLARE @MyVar bigint
SET @myvar = (SELECT count(*) FROM spt_values);
SELECT @myvar
 
結果:2346(私のデータベース内)

注意: @myvar = @Myvar

13

次を使用できます。

declare @foo as nvarchar(25)

select @foo = 'bar'

select @foo
3

また、最初の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回追加することで解決できますが、この場合は変数アプローチを使用する方が適切です。この最後のバージョンはデモ用です。

よろしく。

2
Pittsburgh DBA

これは、元の質問に対して機能します:

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

どういう意味?クエリの結果を他のクエリに再利用しますか?

その場合、最初のクエリの結果内で2番目のクエリを検索して、両方のクエリを組み合わせてみませんか(SELECT xxx in (SELECT yyy...)

1
Luk