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)
如果您想保留表名但通过新名称引用现有列,则计算列将为您执行此操作。该列的计算值将只是现有列的值。
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)
两列始终具有相同的值。
如果您只引用计算列,我的猜测是甚至不会有运行时开销。
您不能为列创建同义词;同义词是对表和存储过程等第一类实体的简单重定向。该文档列出了候选对象类型(列不在列表中):
可以为以下类型的对象创建同义词:
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 *,并且您必须更新当前引用旧名称的所有存储过程、视图或应用程序代码。