web-dev-qa-db-ja.com

SQL Serverで列のシノニムを作成する方法は?

以下は動作していません。 SQL Server 2017で列にシノニムを作成したいのですが、どうすればよいですか?

CREATE SYNONYM dbo.[ProductTest] for [dbo].[Product].[ProductId]
GO

select ProductTest from dbo.Product
2
user168914

テーブル名は保持したいが、既存の列を新しい名前で参照する場合は、 計算された列 がこれを行います。列の計算値は、既存の列の値になります。

alter table [dbo].[Product]
add [ProductTest] as ([ProductId]);

今書くことができます

select
    [ProductId],
    [ProductTest] 
from [dbo].[Product];

2つの列の値は常に同じです。

計算された列のみを参照する場合、実行時にオーバーヘッドが発生することはないと思います。

8
Michael Green

列の同義語を作成することはできません。シノニムは、テーブルやストアドプロシージャなどのファーストクラスエンティティへの単純なリダイレクトです。 ドキュメント は候補となるオブジェクトタイプをリストします(列はリストにありません):

同義語は、次のタイプのオブジェクトに対して作成できます。

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

元の列名を選択するストアドプロシージャが既にあり、元の代わりにエイリアスを条件付きで返す場合sometimesWITH 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 *に戻るので、古い名前を現在参照しているストアドプロシージャ、ビュー、またはアプリケーションコードを更新する必要があることに注意してください。

3
Aaron Bertrand