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.
3 Réponses :
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)
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))
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)
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.