Ce qui suit ne fonctionne pas. Je souhaite créer un synonyme sur une colonne de SQL Server 2017. Comment allais-je faire cela?
CREATE SYNONYM dbo.[ProductTest] for [dbo].[Product].[ProductId]
GO
select ProductTest from dbo.Product
Si vous souhaitez conserver le nom de la table mais reportez-vous à une colonne existante par un nouveau nom A colonne calculée le fera pour vous. La valeur calculée de la colonne ne sera que la valeur de la colonne existante.
alter table [dbo].[Product]
add [ProductTest] as ([ProductId]);
Maintenant tu peux écrire
select
[ProductId],
[ProductTest]
from [dbo].[Product];
Les deux colonnes auront la même valeur, toujours.
Si vous ne faites référence que la colonne calculée, je suppose qu'il n'y aura même pas de surcharge de temps d'exécution.
Vous ne pouvez pas créer de synonyme pour une colonne; Les synonymes sont de simples redirections aux entités de première classe telles que des tables et des procédures stockées. la documentation répertorie les types d'objets candidats (et la colonne ne figure pas dans la liste):
Synonymes peut être créé pour les types d'objets suivants:
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
Pour simuler un synonyme, si vous ne pouvez pas modifier la table, vous pouvez créer une vue et forcer les utilisateurs à accéder à la vue au lieu de la table:
CREATE VIEW dbo.vProduct
AS
SELECT ProductTest = ProductID FROM dbo.Product;
Ou contrôler l'accès via une procédure stockée:
CREATE PROCEDURE dbo.Product_Get
AS
BEGIN
SET NOCOUNT ON;
SELECT ProductTest = ProductID FROM dbo.Product;
END
GO
Si vous avez déjà une procédure stockée qui sélectionne le nom de la colonne d'origine et que vous souhaitez renvoyer de manière conditionnelle l'alias au lieu de l'original, parfois , vous pouvez utiliser WITH RESULT SETS
. L'inconvénient est que vous devez définir le type de données:
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
Si vous pouvez changer la table et qu'il doit être plus transparent, vous pouvez créer une colonne calculée, comme Michael Green suggère . Notez simplement que maintenant les deux colonnes reviendront dans SELECT *
Et vous devrez mettre à jour les procédures, les vues ou le code d'application stockées qui référent actuellement l'ancien nom.