如何为 SQL Server 中的列创建同义词?

3 sql-server synonyms sql-server-2016 sql-server-2017

以下不起作用。我想在 SQL Server 2017 中的列上创建同义词。我将如何执行此操作?

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

select ProductTest from dbo.Product
Run Code Online (Sandbox Code Playgroud)

Mic*_*een 9

如果您想保留表名但通过新名称引用现有列,则计算列将为您执行此操作。该列的计算值将只是现有列的值。

alter table [dbo].[Product]
add [ProductTest] as ([ProductId]);
Run Code Online (Sandbox Code Playgroud)

现在你可以写

select
    [ProductId],
    [ProductTest] 
from [dbo].[Product];
Run Code Online (Sandbox Code Playgroud)

两列始终具有相同的值。

如果您只引用计算列,我的猜测是甚至不会有运行时开销。


Aar*_*and 5

您不能为列创建同义词;同义词是对表和存储过程等第一类实体的简单重定向。该文档列出了候选对象类型(列不在列表中):

可以为以下类型的对象创建同义词:

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
Run Code Online (Sandbox Code Playgroud)

要模拟同义词,如果无法更改表,可以创建视图,并强制用户访问视图而不是表:

CREATE VIEW dbo.vProduct
AS
  SELECT ProductTest = ProductID FROM dbo.Product;
Run Code Online (Sandbox Code Playgroud)

或者通过存储过程控制访问:

CREATE PROCEDURE dbo.Product_Get
AS
BEGIN
  SET NOCOUNT ON;
  SELECT ProductTest = ProductID FROM dbo.Product;
END
GO
Run Code Online (Sandbox Code Playgroud)

如果您已经有一个选择原始列名的存储过程,并且您希望有条件地返回别名而不是原始列名,有时,您可以使用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
Run Code Online (Sandbox Code Playgroud)

如果您可以更改表并且需要更加透明,则可以创建一个计算列,正如 Michael Green 所建议的那样。请注意,现在两列都将返回SELECT *,并且您必须更新当前引用旧名称的所有存储过程、视图或应用程序代码。