0
votes

SQL Server: erreur affectée au nom d'une variable locale

J'ai un problème avec l'attribution d'un nom de base de données à une variable. Lorsque je fais cela, je reçois un message indiquant qu'il n'y a pas de telle base de données.

Qu'est-ce que je fais de mal que ce script ne fonctionne pas?

DECLARE @db_name varchar(10) 
SET @db_name = 'xxx'

ALTER TABLE [@db_name].[dbo].[Table_Name] 
    DROP CONSTRAINT [Constraint_Name]
GO

ALTER TABLE [@db_name].[dbo].[Table_Name] WITH CHECK 
    ADD CONSTRAINT [Constraint_Name] CHECK (QUERY)
GO

ALTER TABLE [@db_name].[dbo].[Table_Name] CHECK CONSTRAINT [Constraint_Name]
GO

obtenir ce message d'erreur:

Msg 2702, niveau 16, état 2, ligne 5
La base de données '@db_name' n'existe pas.

Msg 2702, niveau 16, état 2, ligne 8
La base de données '@db_name' n'existe pas.

Msg 2702, niveau 16, état 2, ligne 11
La base de données '@db_name' n'existe pas.


2 commentaires

Quel est le nom de votre table?


La table porte le nom BigBookEntry . Cependant, c'est un peu comme si la table s'appelle, cela n'a pas d'importance.


3 Réponses :


1
votes

Une requête - c'est-à-dire tout le texte jusqu'à chaque commande GO - est compilée avant son exécution.

Les noms de base de données dans les requêtes doivent être connus au moment de la compilation , parce que la base de données + toute table ou colonne que vous spécifiez sont inspectés par le compilateur de requêtes pour voir si elles sont valides.

Cela signifie que les noms de base de données + les noms de table + les noms de colonnes ne peuvent pas tous em > proviennent de @ -variables, car au moment de la compilation, les variables n'existent pas encore et n'ont pas de valeur.

Le correctif consiste à utiliser du SQL dynamique:

DECLARE @db_name varchar(10) = 'xxx'
DECLARE @sql varchar(1000) = 'ALTER TABLE [' + @db_name + '].[dbo].[Table_Name] DROP CONSTRAINT [Constraint_Name]'

EXEC (@sql)


0 commentaires

1
votes

Disons par exemple que vous avez une table créée comme ceci:

EXEC sp_executesql @query;

Ensuite, vous devrez créer deux variables (une pour le nom de l'objet et une pour la requête à exécuter. ..):

SET @db_name = 'xxx';
set @query = 'ALTER TABLE ['+ @db_name +' ] DROP CONSTRAINT [AK_TransactionID]';

Définissez-les sur les valeurs dont vous avez besoin:

DECLARE @db_name varchar(10) ;
DECLARE @query nvarchar(500) ;

Et puis exécutez la requête: p>

create table xxx(id int
                 CONSTRAINT AK_TransactionID UNIQUE(id))

Voici une démo p>


0 commentaires

1
votes

Malheureusement, dans SQL Server, vous ne pouvez pas transmettre les noms de schéma, de base de données, de table ou de colonne en tant que paramètre - si vous voulez faire cela, vous devez utiliser le SQL dynamique. Vous pouvez faire ce qui suit pour y parvenir:

DECLARE @db_name VARCHAR(MAX)
DECLARE @SQL VARCHAR(MAX)
SET @db_name = [xxx]

SET @SQL = 'ALTER TABLE' + @db_name+ '.[dbo].[Table_Name] DROP CONSTRAINT [Constraint_Name]'
EXEC (@SQL)

SET @SQL = 'ALTER TABLE' + @db_name + '.[dbo].[Table_Name]  WITH CHECK ADD  CONSTRAINT [Constraint_Name] CHECK  (QUERY)'
EXEC (@SQL)

SET @SQL = 'ALTER TABLE' + @db_name + '.[dbo].[Table_Name] CHECK CONSTRAINT [Constraint_Name]'
EXEC (@SQL)


0 commentaires