2017-04-08 1 views
0

J'essaie d'exécuter une instruction pour attacher une variable à un nom de table. Je suis nouveau sur sql et je n'ai pas trouvé de solution à ce problème en ligne.Doit déclarer la variable scalaire lors de l'utilisation d'une variable de temps dans le serveur SQL

Declare @t time 
Set @t='12:00:00.1' 
Declare @ttable varchar (255) 
Set @ttable='Temp'+(Select top 1 ID from mtable) 

    Exec('Insert into '[email protected]+'(Timestamp) values ('+'@t'+')') 

Chaque fois que je lance cette requête, je reçois l'erreur suivante:

Msg 137, Level 15, State 2, Line 1 Must declare the scalar variable "@t".

Je ne sais pas exactement ce dont je tourne. Je viens d'ouvrir SQL Server Management Studio (SQL Server 2008 R2) et créé une base de données et des tables. Toute aide est très appréciée.

+1

Laissez tomber les guillemets autour @t dans l'exécutif? –

+0

Modifiez votre question et fournissez des exemples de données, les résultats souhaités et expliquez ce que vous essayez de faire. "attacher une variable à un nom de table" n'est pas sensé. –

Répondre

1

La méthode correcte pour appeler dynamiquement une instruction SQL consiste à utiliser sp_executesql et ses paramètres. En supposant que votre table existe déjà, vous feriez:

Declare @t time; 
Set @t = '12:00:00.1'; 

Declare @tablename varchar(255); 

Set @tablename = 'Temp'+ (Select top 1 ID from mtable); 

declare @sql nvarchar(max) 
set @sql = 'Insert into @tablename(Timestamp) values (@t)'; 

set @sql = replace(@sql, '@tablename', @tablename); -- alas, cannot use parameters for table names 

exec sp_executesql @sql, N'@t time', @t = @t; 

Je pense qu'il est une conception de base de données pauvres qui construit des noms de table comme celle-ci. Au lieu de cela, vous devez avoir une seule table et une colonne supplémentaire pour le id.

+0

Ceci me donne les erreurs suivantes: Msg 102, niveau 15, état 1, ligne 6 Syntaxe incorrecte près de '='. Msg 137, niveau 15, état 2, ligne 7 Doit déclarer la variable scalaire "@sql". Msg 137, niveau 15, état 2, ligne 9 Doit déclarer la variable scalaire "@sql". – Kuba

+0

@Kuba réponse est éditée essayer maintenant – Hadi

+0

Cela a fonctionné. Je vous remercie! – Kuba

0

Vous pouvez essayer

Declare @t time 
declare @tVar varchar(max) 
Set @t='12:00:00.1' 
set @tVar=CONVERT(VARCHAR,@t) 
Declare @ttable varchar (255) 
Set @ttable='Temp'+(Select '1') 

    --PRINT('Insert into '[email protected]+'(Timestamp) values ('+CONVERT(VARCHAR,@t)+')') 
    EXEC ('Insert into '[email protected]+'(Timestamp) values ('[email protected]+')')