以下は動作していません。 SQL Server 2017で列にシノニムを作成したいのですが、どうすればよいですか?
CREATE SYNONYM dbo.[ProductTest] for [dbo].[Product].[ProductId]
GO
select ProductTest from dbo.Product
テーブル名は保持したいが、既存の列を新しい名前で参照する場合は、 計算された列 がこれを行います。列の計算値は、既存の列の値になります。
alter table [dbo].[Product]
add [ProductTest] as ([ProductId]);
今書くことができます
select
[ProductId],
[ProductTest]
from [dbo].[Product];
2つの列の値は常に同じです。
計算された列のみを参照する場合、実行時にオーバーヘッドが発生することはないと思います。
列の同義語を作成することはできません。シノニムは、テーブルやストアドプロシージャなどのファーストクラスエンティティへの単純なリダイレクトです。 ドキュメント は候補となるオブジェクトタイプをリストします(列はリストにありません):
同義語は、次のタイプのオブジェクトに対して作成できます。
CLR Stored Procedure CLR Table-valued Function
CLR Scalar Function CLR Aggregate Functions
Replication-filter-procedure Extended Stored Procedure
Scalar Function Table-valued Function
Inline-table-valued Function Stored Procedure
View Table1
シノニムをシミュレートするために、テーブルを変更できない場合は、ビューを作成して、ユーザーにテーブルではなくビューへのアクセスを強制できます。
CREATE VIEW dbo.vProduct
AS
SELECT ProductTest = ProductID FROM dbo.Product;
または、ストアドプロシージャを使用してアクセスを制御します。
CREATE PROCEDURE dbo.Product_Get
AS
BEGIN
SET NOCOUNT ON;
SELECT ProductTest = ProductID FROM dbo.Product;
END
GO
元の列名を選択するストアドプロシージャが既にあり、元の代わりにエイリアスを条件付きで返す場合sometimes、WITH RESULT SETS
を使用できます。欠点は、データ型を定義する必要があることです。
CREATE PROCEDURE dbo.Product_Get_v2
AS
BEGIN
SET NOCOUNT ON;
SELECT ProductID FROM dbo.Product;
END
GO
EXEC dbo.Product_Get_v2;
-- returns column ProductID
EXEC dbo.Product_Get_v2 WITH RESULT SETS ((ProductTest int));
-- returns column ProductTest
テーブルを変更でき、より透過的にする必要がある場合は、計算された列を作成できます Michael Greenの提案どおり 。両方の列がSELECT *
に戻るので、古い名前を現在参照しているストアドプロシージャ、ビュー、またはアプリケーションコードを更新する必要があることに注意してください。