Sql-Server

如何為 SQL Server 中的列創建同義詞?

  • October 10, 2019

以下不起作用。我想在 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];

兩列將始終具有相同的值。

如果您僅引用計算列,我的猜測是甚至不會有執行時成本。

您不能為列創建同義詞;同義詞是對錶和儲存過程等一流實體的簡單重定向。該文件列出了候選對像類型(並且列不在列表中):

可以為以下類型的對象創建同義詞:

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

如果您已經有一個選擇原始列名的儲存過程,並且您希望有條件地返回別名而不是原始別名,有時,您可以使用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 *,您必須更新目前引用舊名稱的所有儲存過程、視圖或應用程式碼。

引用自:https://dba.stackexchange.com/questions/227130