Requete: "CREATE TABLE truc LIKE Machin" Erreur de syntaxe !! ?

Requete: "CREATE TABLE truc LIKE Machin" Erreur de syntaxe !! ? - SQL/NoSQL - Programmation

Marsh Posté le 31-08-2014 à 16:04:22    

Presque tout est dans le titre...
 
sous visual studio 11 j'ai une requête de copie de table: "CREATE TABLE truc LIKE Machin" ... rien de plus.
La réponse est "Erreur de syntaxe" , rien n'est crée, la table Machin existe bien, sa structure est simple, elle n'est reliée à rien..
 
çà fait déjà 15 jours que je fouille internet en long et en large ( y compris en anglais) pour comprendre quelle est l'erreur de syntaxe..
Là je comprends plus... Si une bonne âme veut bien me sortir de cette ornière ou me donner une piste.
 
merci d'avance.
 
P.S.: j'ai la même réponse avec la requête : "CREATE TABLE truc AS (SELECT * FROM Machin)"
réponse debug : Erreur de syntaxe dans l'instruction CREATE TABLE. (OleDBException non gérée)


Message édité par projetx le 31-08-2014 à 16:46:43
Reply

Marsh Posté le 31-08-2014 à 16:04:22   

Reply

Marsh Posté le 01-09-2014 à 07:20:14    

A quel SGDB tu te connectes?

Reply

Marsh Posté le 01-09-2014 à 08:26:41    

C'est louche, en effet...
Tu l'as crée où ta table truc? Pas de besoin de spécifier une base de donnée? une bib? dans visual studio?
Est ce que tu peux créer cette table , en copiant cette instruction dans un autre script? ou dans un exécuteur sql?

 

Un truc "con" quand ça bug comme ça, c'est que tu as une erreur de syntaxe "juste" avant, qui te met le binz et ton visual studio intercepte le message d'erreur sur cette instruction....
C'est généralement ce qui arrive quand ça "bug" sur un truc aussi basique...
:bounce:


Message édité par gpl73 le 01-09-2014 à 08:27:45

---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 01-09-2014 à 14:46:24    

J'ai crée la table origine dans access avec access.
je veux faire la copie de cette table avec visual (create puis insert)
(l'originale s'appelle trucA et les copies s'appellent truc37, truc38... etc ( truc + N° de semaine)....
Le pire là-dedans c'est que lorsque j'ai codé çà en juillet çà fonctionnait... j'ai mis propre et kek commentaires pour m'y retrouver facile.... je lache çà du 27/07 au 18/08 et bingo çà me fait le coup de l'erreur de syntaxe....
Juste avant dans le code, il y a une procédure pour sélectionner les semaines et là tout fonctionne bien.
Comme çà me gavait, j'ai coupé celle où les tables sont crées dans le code et j'ai fait une procédure spéciale avec une seule create(aucune itération) où juste une table est faite: "CREATE TABLE Machin LIKE trucA" et même ce truc simple... erreur de syntaxe !
 
je perds mes derniers cheveux à la vitesse grand V....  :pt1cable:
 
P.S.: toutes les autres requêtes ailleurs dans le code type SELECT; UPDATE; INSERT INTO ... fonctionnent sans embrouilles !


Message édité par projetx le 02-09-2014 à 00:19:35
Reply

Marsh Posté le 02-09-2014 à 08:11:02    

si tu dis que cela a marché ... et qu'après le coup de mettre au propre et des commentaires, c'est cool ....
cela veut dire que tu as "viré" qq chose en trop, ou mis qq chose en commentaire qu'il ne fallait pas :)
tes 2 variables sont bien définies?
Elles sont bien alimentées? (ou ça plante lors avant même d'être exécuté)
 
Est ce que dans ta procédure ou ton script, un create table sans variable, le truc simple en dure : create table t1 like t2;
 
Guillaume


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 02-09-2014 à 15:59:52    

gpl73 a écrit :

si tu dis que cela a marché ... et qu'après le coup de mettre au propre et des commentaires, c'est cool ....
cela veut dire que tu as "viré" qq chose en trop, ou mis qq chose en commentaire qu'il ne fallait pas :)
tes 2 variables sont bien définies?
Elles sont bien alimentées? (ou ça plante lors avant même d'être exécuté)
 
Est ce que dans ta procédure ou ton script, un create table sans variable, le truc simple en dure : create table t1 like t2;
 
Guillaume


 
tout d'abord merci de t'intéresser à mon cas !  :)  
 
pour tester hors tout, j'ai crée hier une chtite form avec 2 boutons : zyva et stop où il ya juste çà (simplifié à l'extrème!).
j'ai crée sous access dans la Base de données que j'utilise (C'est la BDD pour pleins d'autres requêtes qui fonctionnent bien) une table: Tabtest avec 3 champs  l' ID, un ouinon et un integer... aucune donnée dans les champs.
 
et voilà le code:
 
Public Class CreeTable
 
    Dim cn1 As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " + Depart.DIR1)
    Dim cmddbA As OleDb.OleDbCommand
 
 
    Private Sub CreeTable_Load(sender As Object, e As EventArgs) Handles MyBase.Load      
    End Sub
 
    Private Sub zyva_Click(sender As Object, e As EventArgs) Handles zyva.Click
        Dim sqldbA As String = "CREATE TABLE Tab00 LIKE TabTest"                              '   ERREUR ?
        cmddbA = New OleDb.OleDbCommand(sqldbA, cn1)
        With cmddbA
            .CommandType = CommandType.Text                                                             ' avec ou sans ne change rien ici
            .Connection.Open()
            .ExecuteNonQuery()                                                                          '   LA CA COINCE !
            .Connection.Close()
        End With
    End Sub
 
    Private Sub Btstop_Click(sender As Object, e As EventArgs) Handles Btstop.Click
        Me.Close()
    End Sub
 
End Class
 
Le chemin DIR1 n'est pas en cause, il fonctionne partout ailleurs sur le projet... (c'est un truc du genre: "C:\Dossier\MaDB.accdb" )
 
et même ce truc ridicule me dit toujours: Erreur de syntaxe dans l'instruction CREATE TABLE.....  
 
voilà la totale:
 
System.Data.OleDb.OleDbException : {"Erreur de syntaxe dans l'instruction CREATE TABLE."}
 
Data : {System.Collections.ListDictionaryInternal}
              [System.Collections.ListDictionaryInternal] : {System.Collections.ListDictionaryInternal}
              Count : 0
              IsFixedSize : False
              IsReadOnly : False
              IsSynchronized : False
              Item : Pour évaluer une propriété indexée, cette dernière doit être qualifiée et l'utilisateur doit fournir les arguments de manière explicite.
              Keys : {System.Collections.ListDictionaryInternal.NodeKeyValueCollection}
              SyncRoot : {Object}
              Values : {System.Collections.ListDictionaryInternal.NodeKeyValueCollection}
 
ErrorCode : -2147217900
 
Errors : {System.Data.OleDb.OleDbErrorCollection}
              Count : 1
              Item : Pour évaluer une propriété indexée, cette dernière doit être qualifiée et l'utilisateur doit fournir les arguments de manière explicite.
              HelpLink : Nothing
              HResult : -2147217900
              InnerException : Nothing
              Message : Erreur de syntaxe dans l'instruction CREATE TABLE.
              Source : Microsoft Office Access Database Engine
 
              StackTrace :    
à System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
à System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
à System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
à System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
à System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
à System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
à Decadix.CreeTable.zyva_Click(Object sender, EventArgs e) dans C:\Users\MB\documents\visual studio 2012\Projects\Decadix\Decadix\CreeTable.vb:ligne 22
à System.Windows.Forms.Control.OnClick(EventArgs e)
à System.Windows.Forms.Button.OnClick(EventArgs e)
à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
à System.Windows.Forms.Control.WndProc(Message& m)
à System.Windows.Forms.ButtonBase.WndProc(Message& m)
à System.Windows.Forms.Button.WndProc(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
à System.Windows.Forms.Application.Run(ApplicationContext context)
à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
à Decadix.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81
à System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
à System.AppDomain.nExecuteAssembly(RuntimeAssembly assembly, String[] args)
à System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
à System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
à System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
à System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
à System.Activator.CreateInstance(ActivationContext activationContext)
à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
à System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
à System.Threading.ThreadHelper.ThreadStart()
 
TargetSite : {Void ExecuteCommandTextErrorHandling(System.Data.OleDb.OleDbHResult)}
 
 
voilà, voilà...  les infos sur stacktrace me depassent un peu beaucoup... je le reconnais. Le N° d'erreur ne me dit rien non plus....  :cry:
 
la table copie : Tab00 n'est pas créee... rien... nada.
encore une chose, le "CREATE TABLE truc (champ1, champ2 ......)" fonctionne.... je suis hyper-plexe...
 
j'ai la même erreur en faisant: "CREATE TABLE Tab00 SELECT * FROM TabTest" ...


Message édité par projetx le 03-09-2014 à 08:38:54
Reply

Marsh Posté le 03-09-2014 à 10:55:10    

Désolé...
Je sèche aussi :)
mais si tu dis que cela a marché avant... c'est cool lol
car cela veut dire que tu as viré qq chose... qui fait que cela ne marche plus .
ta table initiale n' est pas "ouverte"  ou  en cours d'utilisation?  
 
la valeur de sqldbA est bien entre côte ou entre guillemets, comme il se doit lors de l'exe des différentes actions?
 


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 03-09-2014 à 14:54:16    

gpl73 a écrit :

Désolé...
Je sèche aussi :)
mais si tu dis que cela a marché avant... c'est cool lol
car cela veut dire que tu as viré qq chose... qui fait que cela ne marche plus .
ta table initiale n' est pas "ouverte"  ou  en cours d'utilisation?  
 
la valeur de sqldbA est bien entre côte ou entre guillemets, comme il se doit lors de l'exe des différentes actions?
 


 
entre temps je me suis fait un nouveau projet avec une nouvelle DB, même structure que plus haut( ID, un champ numérique, un champ ouinon) aucune donnée dans cette DB.
 
puis une form avec 1 bouton qui lance CREATE:
 
Dim cn1 As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source =  C:\Test\DBtest.accdb" )
Dim cmddbA As OleDb.OleDbCommand
 
Private Sub zyva_Click(sender As Object, e As EventArgs) Handles zyva.Click
        cmddbA = New OleDb.OleDbCommand("CREATE TABLE Tab00 LIKE TabTest", cn1)
        With cmddbA
            .Connection.Open()
            .ExecuteNonQuery()                                                                          
            .Connection.Close()
        End With
End Sub  
 
peut-on faire plus court pour tout un projet?  :D  
 
même réponse: table pas créee, erreur de syntaxe... mais j'ai remarqué qu'il crée une DB lock TestDB.Iaccdb (ce qui me semble-t-il est normal)... mais ensuite elle n'est pas effacée.
Que je suppime ce truc ou pas ne change rien là non plus.... bouh-ouh-snif.  :cry:  
 
j'en suis à penser que çà ne vient pas du code mais de ou  bien Access ou/et Visual Studio......
 
C'est sûr qu'il y a kek chose qui est là qui doit bloquer ... mais là c'est l'aiguille dans le Grand Erg Occidental....


Message édité par projetx le 03-09-2014 à 15:00:53
Reply

Marsh Posté le 04-09-2014 à 07:04:30    

T'es sur que ça existe un CREATE TABLE xxx LIKE yyy ?
Je ne trouve la syntaxe nul part: http://msdn.microsoft.com/en-us/library/bb177893.aspx
 
Essaye avec un create table standard?

Reply

Marsh Posté le 04-09-2014 à 08:29:48    

Oliiii a écrit :

T'es sur que ça existe un CREATE TABLE xxx LIKE yyy ?
Je ne trouve la syntaxe nul part: http://msdn.microsoft.com/en-us/library/bb177893.aspx
 
Essaye avec un create table standard?


 
merci à toi pour le lien.
 
Le CREATE standard ne pose aucun problème, si ce n'est le cas du champ ouinon qui ne met pas de case à cocher dans la table, mais çà c'est connu...
je vais devoir contourner le pb... si j'en crois ton lien.   :cry:  
 
bon j'ai trouvé pour contourner: "SELECT * INTO tab00 FROM Tabtest"
çà copie la table avec les données à l'identique...
 
si les modos veulent fermer, ok pour moi. ce n'est pas résolu, mais contournable...
 
il me reste à comprendre pourquoi ce truc fonctionnait avant ou alors avais-je vraiment testé cette solution là avant les vacances? des fois, on laisse échapper des détails...
 
encore merci à vous deux de m'avoir aidé !
 


Message édité par projetx le 04-09-2014 à 08:45:30
Reply

Marsh Posté le 04-09-2014 à 08:29:48   

Reply

Marsh Posté le 04-09-2014 à 10:55:36    

create table xxx like yyy: fonctionne "très bien" sur sql pour AS400 ...
 
pour une copie, moi j'utilise:
create table xxx as (select * from yyy) with no data (ou avec with data)
ça marche bien aussi ...


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 04-09-2014 à 17:56:07    

gpl73 a écrit :

create table xxx like yyy: fonctionne "très bien" sur sql pour AS400 ...
 
pour une copie, moi j'utilise:
create table xxx as (select * from yyy) with no data (ou avec with data)
ça marche bien aussi ...


 
ni l'un ni l'autre ne fonctionnent...  
mais comme l'a soulevé Oliiii, c'est ici du msdn.M$ sql pour une BdD access...  
je suis allé voir son lien et là effectivement pas de create.. like, pas de create.. as (select....)  .. bref peu pour ce sujet.... d' où --->  je contourne...
c'est pas trop clean... mais bon, çà fait tourner le truc.  :whistle:

Message cité 1 fois
Message édité par projetx le 04-09-2014 à 17:56:50
Reply

Marsh Posté le 05-09-2014 à 10:58:22    

et au lieu de faire une table? tu ne peux pas utiliser un curseur?
si c'est pour une utilisation temporaire? c'est cool...


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 05-09-2014 à 12:16:17    

gpl73 a écrit :

et au lieu de faire une table? tu ne peux pas utiliser un curseur?
si c'est pour une utilisation temporaire? c'est cool...


 
ben, en fait c'est beaucoup plus complexe... ces tables doivent être créées sur une DB utilisée par plusieurs users qui viennent y inscrire des infos via une interface user.
Ces tables sont créées par la personne qui gère le planning sur 1 an et selon les semaines où les users interviennent, il faut créer 3 tables copiées sur un modèle (TabA, TabB, TabP)  auxquelles sera rajouté le N° de semaine de l'année (TabA36, TabB36, TabP36 pour cette semaine-ci.. etc)
... Et toutes ces tables avec leurs infos users seront conservées 5 ans (1 DB par an dans 1 rep année) et il faut une interface "archives" pour retourner fouiller là-dedans.... pas trop temporaire tout çà..
 
Le truc c'est que la personne qui gère ce planning n'a aucune notion d'informatique, si ce n'est cliquer sur une interface qui dit: clique ici pour faire le planning...
d'où la nécessité de créer ces tables par codage.( il y en a environ 40 par an fois 3 tables !)
 
merci à toi de m'avoir proposé les autres idées qui te sont venues sur ce sujet !  :jap:


Message édité par projetx le 05-09-2014 à 12:20:24
Reply

Marsh Posté le 29-10-2014 à 11:35:39    

projetx a écrit :

 

ni l'un ni l'autre ne fonctionnent...
mais comme l'a soulevé Oliiii, c'est ici du msdn.M$ sql pour une BdD access...
je suis allé voir son lien et là effectivement pas de create.. like, pas de create.. as (select....)  .. bref peu pour ce sujet.... d' où --->  je contourne...
c'est pas trop clean... mais bon, çà fait tourner le truc.  :whistle:


Pour copier une table avec SQL Server, c'est "select * into table_destination from table_source" (avec filtres possibles sur les colonnes et les lignes).

 

J'imagine que la syntaxe est la même pour Access.

 

Donc copier uniquement la structure d'une table :

 
Code :
  1. SELECT * INTO table_destination FROM table_source WHERE NULL IS NOT NULL
 

En revanche, ça ne copie pas les index et autres éléments (contraintes, clés étrangères, etc.)
Uniquement les types de données des colonnes sont préservés.


Message édité par MagicBuzz le 29-10-2014 à 11:35:55
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed