TSQL変数を定数にする方法はありますか?



Is There Way Make Tsql Variable Constant



解決:

いいえ。ただし、関数を作成してそこにハードコードし、それを使用することはできます。

次に例を示します。



CREATE FUNCTION fnConstant()RETURNS INT AS BEGIN RETURN 2 END GO SELECT dbo.fnConstant() 

Jared Koが提供する1つの解決策は、 疑似定数

SQL Serverで説明されているように:変数、パラメーター、またはリテラル?または…定数?:



疑似定数は変数またはパラメーターではありません。代わりに、それらは1つの行と、定数をサポートするのに十分な列を持つ単純なビューです。これらの単純なルールを使用すると、SQLエンジンはビューの値を完全に無視しますが、その値に基づいて実行プランを作成します。実行プランには、ビューへの参加すら表示されません。

次のように作成します。

CREATE SCHEMA ShipMethodGO-各ビューは1行のみを持つことができます。 -必要な定数ごとに1つの列を作成します。 -各列は単一の値に制限されています。 CREATE VIEW ShipMethod.ShipMethodID AS SELECT CAST(1 AS INT)AS [XRQ-TRUCK GROUND]、CAST(2 AS INT)AS [ZY-EXPRESS]、CAST(3 AS INT)AS [OVERSEAS-DELUXE]、CAST(4 AS INT)AS [OVERNIGHT J-FAST]、CAST(5 AS INT)AS [CARGO TRANSPORT 5]

次に、次のように使用します。



SELECTh。* FROM Sales.SalesOrderHeader h JOIN ShipMethod.ShipMethodID const ON h.ShipMethodID = const。[OVERNIGHTJ-FAST]

またはこのように:

SELECTh。* FROM Sales.SalesOrderHeader h WHERE h.ShipMethodID =(SELECT TOP 1 [OVERNIGHT J-FAST] FROM ShipMethod.ShipMethodID)

欠落している定数に対する私の回避策は、オプティマイザーに値についてのヒントを与えることです。

DECLARE @Constant INT = 123; SELECT * FROM [some_relation] WHERE [some_attribute] = @Constant OPTION(OPTIMIZE FOR(@Constant = 123))

これは、実行プランを作成するときに変数を定数であるかのように扱うようにクエリコンパイラに指示します。欠点は、値を2回定義する必要があることです。