85

ビュー内で変数を宣言することは可能ですか? 例えば:

Declare @SomeVar varchar(8) = 'something'

構文エラーが表示されます:

キーワード「Declare」付近の構文が正しくありません。

4

8 に答える 8

67

あなたは正しいです。VIEW ではローカル変数は使用できません。

結果セットを返すテーブル値関数でローカル変数を設定できます (ビューのように)。

http://msdn.microsoft.com/en-us/library/ms191165.aspx

例えば

CREATE FUNCTION dbo.udf_foo()
RETURNS @ret TABLE (col INT)
AS
BEGIN
  DECLARE @myvar INT;
  SELECT @myvar = 1;
  INSERT INTO @ret SELECT @myvar;
  RETURN;
END;
GO
SELECT * FROM dbo.udf_foo();
GO
于 2011-05-24T18:08:06.670 に答える
50

WITH を使用して式を定義できます。次に、単純な Sub-SELECT を実行して、それらの定義にアクセスします。

CREATE VIEW MyView
AS
  WITH MyVars (SomeVar, Var2)
  AS (
    SELECT
      'something' AS 'SomeVar',
      123 AS 'Var2'
  )

  SELECT *
  FROM MyTable
  WHERE x = (SELECT SomeVar FROM MyVars)
于 2016-12-09T13:49:49.590 に答える
4

spencer7593 が述べたように関数を使用することは、動的データに対する正しいアプローチです。静的データの場合、(sprocs で大規模な手続き型コードを記述するアンチパターンとは対照的に) SQL データ設計と一致する、よりパフォーマンスの高いアプローチは、静的値を持つ別のテーブルを作成し、それに結合することです。これは、SQL エンジンが JOIN を中心に効果的な実行計画を構築できるため、パフォーマンスの観点から非常に有益であり、必要に応じてインデックスを追加することもできます。

関数 (または任意のインライン計算値) を使用することの欠点は、返される可能性のあるすべての行に対してコールアウトが発生することであり、これにはコストがかかります。なんで?SQL は、最初に計算された値で完全なデータセットを作成し、次にそのデータセットに WHERE 句を適用する必要があるためです。

10 回のうち 9 回は、クエリで動的に計算されたセル値を必要としないはずです。必要なものを把握し、それをサポートするデータ モデルを設計し、そのデータ モデルに(たとえばバッチ ジョブを介して)半動的データを入力し、SQL エンジンを使用して標準 SQL を介して手間のかかる作業を行う方がはるかに優れています。 .

于 2016-09-01T14:07:48.583 に答える
4

はい、これは正しいです。ビューに変数を含めることはできません (他の制限もあります)。

ビューは、結果を select ステートメントで置き換えることができる場合に使用できます。

于 2011-05-24T18:05:32.363 に答える
1

私がしていることは、テーブル変数と同じ選択を実行するビューを作成し、そのビューを 2 番目のビューにリンクすることです。したがって、ビューは別のビューから選択できます。これは同じ結果を達成します

于 2016-06-08T01:55:52.670 に答える