ビュー内で変数を宣言することは可能ですか?例えば:
Declare @SomeVar varchar(8) = 'something'
構文エラーが発生します:
キーワード「Declare」の近くの構文が正しくありません。
ビュー内で変数を宣言することは可能ですか?例えば:
Declare @SomeVar varchar(8) = 'something'
構文エラーが発生します:
キーワード「Declare」の近くの構文が正しくありません。
回答:
あなたは正しいです。ローカル変数は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
WITHを使用して式を定義できます。次に、単純なサブ選択を実行して、これらの定義にアクセスします。
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)
編集: @bummiが指摘したように、以前の回答でCTEを使用しようとしましたが、これは正しくありませんでした。このオプションは代わりに機能するはずです:
この問題を回避するために、CROSSAPPLYを使用する1つのオプションを次に示します。
SELECT st.Value, Constants.CONSTANT_ONE, Constants.CONSTANT_TWO
FROM SomeTable st
CROSS APPLY (
SELECT 'Value1' AS CONSTANT_ONE,
'Value2' AS CONSTANT_TWO
) Constants
@datenstationには正しい概念がありました。CTEを使用して変数の名前をキャッシュする実際の例を次に示します。
CREATE VIEW vwImportant_Users AS
WITH params AS (
SELECT
varType='%Admin%',
varMinStatus=1)
SELECT status, name
FROM sys.sysusers, params
WHERE status > varMinStatus OR name LIKE varType
SELECT * FROM vwImportant_Users
また経由 JOIN
WITH params AS ( SELECT varType='%Admin%', varMinStatus=1)
SELECT status, name
FROM sys.sysusers INNER JOIN params ON 1=1
WHERE status > varMinStatus OR name LIKE varType
また経由 CROSS APPLY
WITH params AS ( SELECT varType='%Admin%', varMinStatus=1)
SELECT status, name
FROM sys.sysusers CROSS APPLY params
WHERE status > varMinStatus OR name LIKE varType
前述のspencer7593として関数を使用することは、動的データの正しいアプローチです。静的データの場合、SQLデータ設計と一貫性のあるよりパフォーマンスの高いアプローチ(sprocsで大量のプロシージャルコードを書き込むアンチパターンとは対照的に)は、静的値を使用して別のテーブルを作成し、それに結合することです。SQLエンジンはJOINを中心に効果的な実行プランを構築でき、必要に応じてインデックスを追加できる可能性があるため、これはパフォーマンスの観点から非常に有益です。
関数(またはインライン計算値)を使用することの欠点は、返される可能性のあるすべての行に対してコールアウトが発生することです。これにはコストがかかります。どうして?SQLは、最初に計算値を使用して完全なデータセットを作成してから、そのデータセットにWHERE句を適用する必要があるためです。
10回のうち9回は、クエリで動的に計算されたセル値を必要としないはずです。何が必要かを理解し、それをサポートするデータモデルを設計し、そのデータモデルに半動的データを入力し(たとえばバッチジョブを介して)、SQLエンジンを使用して標準SQLを介して手間のかかる作業を行う方がはるかに優れています。
はい、これは正しいです。ビューに変数を含めることはできません(他の制限もあります)。
ビューは、結果をselectステートメントで置き換えることができる場合に使用できます。
私がやっていることは、テーブル変数と同じ選択を実行するビューを作成し、そのビューを2番目のビューにリンクすることです。したがって、ビューは別のビューから選択できます。これは同じ結果を達成します
どのくらいの頻度でビューを更新する必要がありますか?新しいデータが月に1回来るという同様のケースがあります。次に、それをロードする必要があり、ロードプロセス中に新しいテーブルを作成する必要があります。その瞬間、私は自分の見方を変えて変化を検討します。私はこの他の質問の情報をベースとして使用しました:
そこでは、2つの方法でそれを行うことが提案されています。