J'essaie d'exécuter cette requête:
declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename
Cela produit l'erreur suivante:
Msg 1087, Niveau 16, Etat 1, Ligne 5
Doit déclarer la variable de table "@nom de table".
Quelle est la bonne façon d'avoir le nom de la table rempli dynamiquement?
Les noms de table et de colonne doivent être statiques si la requête est statique. Pour les noms de table ou de colonne dynamiques, vous devez générer le code SQL complet de manière dynamique et utiliser sp_executesql pour l'exécuter.
Plus de détails ici: La malédiction et les bénédictions de SQL dynamique
Changez votre dernière déclaration en ceci:
EXEC('SELECT * FROM ' + @tablename)
Voici comment je fais le mien dans une procédure stockée. Le premier bloc va déclarer la variable et définir le nom de la table en fonction du nom de l'année et du mois en cours, dans ce cas TEST_2012OCTOBER. Je vérifie ensuite s'il existe déjà dans la base de données et le supprime le cas échéant. Ensuite, le bloc suivant utilisera une instruction SELECT INTO pour créer la table et la remplir avec les enregistrements d'une autre table avec des paramètres.
--DECLARE TABLE NAME VARIABLE DYNAMICALLY
DECLARE @table_name varchar(max)
SET @table_name =
(SELECT 'TEST_'
+ DATENAME(YEAR,GETDATE())
+ UPPER(DATENAME(MONTH,GETDATE())) )
--DROP THE TABLE IF IT ALREADY EXISTS
IF EXISTS(SELECT name
FROM sysobjects
WHERE name = @table_name AND xtype = 'U')
BEGIN
EXEC('drop table ' + @table_name)
END
--CREATES TABLE FROM DYNAMIC VARIABLE AND INSERTS ROWS FROM ANOTHER TABLE
EXEC('SELECT * INTO ' + @table_name + ' FROM dbo.MASTER WHERE STATUS_CD = ''A''')
Vous ne pouvez pas utiliser un nom de table pour une variable, vous devriez le faire à la place:
DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'SELECT * from yourtable'
EXEC (@sqlCommand)
Un peu en retard pour une réponse mais devrait aider quelqu'un d'autre:
CREATE PROCEDURE [dbo].[GetByName]
@TableName NVARCHAR(100)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @sSQL nvarchar(500);
SELECT @sSQL = N'SELECT * FROM' + QUOTENAME(@TableName);
EXEC sp_executesql @sSQL
END
Vous aurez besoin de générer le SQL dynamiquement:
declare @tablename varchar(50)
set @tablename = 'test'
declare @sql varchar(500)
set @sql = 'select * from ' + @tablename
exec (@sql)
Utilisez sp_executesql
pour exécuter tout code SQL, par exemple.
DECLARE @tbl sysname,
@sql nvarchar(4000),
@params nvarchar(4000),
@count int
DECLARE tblcur CURSOR STATIC LOCAL FOR
SELECT object_name(id) FROM syscolumns WHERE name = 'LastUpdated'
ORDER BY 1
OPEN tblcur
WHILE 1 = 1
BEGIN
FETCH tblcur INTO @tbl
IF @@fetch_status <> 0
BREAK
SELECT @sql =
N' SELECT @cnt = COUNT(*) FROM dbo.' + quotename(@tbl) +
N' WHERE LastUpdated BETWEEN @fromdate AND ' +
N' coalesce(@todate, ''99991231'')'
SELECT @params = N'@fromdate datetime, ' +
N'@todate datetime = NULL, ' +
N'@cnt int OUTPUT'
EXEC sp_executesql @sql, @params, '20060101', @cnt = @count OUTPUT
PRINT @tbl + ': ' + convert(varchar(10), @count) + ' modified rows.'
END
DEALLOCATE tblcur
En outre, vous pouvez utiliser cette ...
DECLARE @SeqID varchar(150);
DECLARE @TableName varchar(150);
SET @TableName = (Select TableName from Table);
SET @SeqID = 'SELECT NEXT VALUE FOR '+ @TableName + '_Data'
exec (@SeqID)