web-dev-qa-db-fra.com

Comment créer un synonyme pour une colonne de SQL Server?

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
3
user168914

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.

8
Michael Green

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.

3
Aaron Bertrand