web-dev-qa-db-fra.com

Nom de la table en tant que variable

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?

131
SoftwareGeek

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

100
mdma

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''')
76
Tim

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)
33
dcp

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
29
Atul Chaudhary

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)
11

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
4
ghgh

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)
0
Disha Sojitra