# Fehler in Stored Procedure



## BlackC (30. Jul 2010)

Hallo Jungs, ich verzweifle gerade ein wenig ;(

Ich betreibe eine MS SQL Server 2008 R2 und möchte über ein Java-Programm in beliebiger Instance / Datenbank meine Stored Procedures erstellen, die ein weiteres Programm braucht. 

DIe SQL-Query Datei hab ich geschrieben und die lässt sich auch ohne Probleme über den MS SQL Server Mangament ausführen.

Nun möchte ich diese Datei einlesen und über "execute" ausführen lassen. Dazu lese ich mit der folgenden Methode die SQL-Datei aus:


```
public String sqlFileReader(String filepath )
     {
        String sqlstmt ="";
        try
        {
            BufferedReader br = new BufferedReader(new FileReader(filepath));

            String zeile = "";
            while ((zeile = br.readLine())!= null)
            {
              //System.out.println(zeile);
              sqlstmt += zeile;
              sqlstmt += "\n"; //Damit jede Zeile voneinader getrennt ist
            }
            br.close();
            return sqlstmt;
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
        }
        return sqlstmt;
     }
```

Den String lass ich dann so ausführen:


```
public void createStoredProcedures(String driver, String address, String port, String name, String user, String pw)
    {
        try
        {
            setConfiguration(driver, address, port, name, user, pw);
            loadDBDriver();
            createConnection();
            createStatement();
            
            Filemanagement readSQLFile = new Filemanagement();
            String spoutsql = readSQLFile.sqlFileReader(".\\settings\\Create_SP_for_LA06.sql");
            
            
            
            if(spoutsql != null)
            {
                System.out.println(spoutsql);
                stmt.executeQuery(spoutsql);
            }
            else
            {
               //Fehler werfen
            }            
           closeConnection();
        }
        catch(SQLException se)
        {
            se.printStackTrace();
            JFrame frame = new JFrame();
            String message = se.getMessage();
            JOptionPane.showMessageDialog(frame, message,"ERROR by creating Stored Procedure", JOptionPane.ERROR_MESSAGE);
        }
    }
```

Nun bekomm ich aber bei der AUsführung den Fehler:
com.microsoft.sqlserver.jdbc.SQLServerException: Falsche Syntax in der Nähe von 'GO'.

Hierzu noch meine SQL-Query:


```
IF OBJECT_ID ( 'dbo.usp_createDeviceTable', 'P') IS NOT NULL
    DROP PROCEDURE usp_createDeviceTable;
GO

CREATE PROCEDURE usp_createDeviceTable(
 @tablename varchar(50)
 ) 
 AS 
 Declare @SQL VarChar(1000) 
 SELECT @SQL = 'Create Table ' + @tablename 
 SELECT @SQL = @SQL + '(Id integer NOT NULL IDENTITY(1,1) Primary Key , Name varchar(100) NOT NULL, State varchar(100) NOT NULL)' 
 Exec (@SQL) 
GO
```

Wo liegt der Fehler?


----------



## andiv (1. Aug 2010)

Ich vermute er mag die beiden "GO"-Anweisungen nicht. Probier doch mal die Zeilen mit "GO" beim Einlesen herauszufiltern.
Danach könntest du auch noch probieren, das Query in mehrere Queries aufzuteilen und jedes einzeln mit executeQuery auszuführen, bzw. mit addBatch(...) und executeBatch() dann alle auf einmal ausführen.


----------



## BlackC (3. Aug 2010)

danke für die Antwort, werds ausprobieren, allerdings sollte es doch eigentlich auch so gehen, ohne eine batch zu erstellen.


----------



## andiv (3. Aug 2010)

Mit "GO" wirds denke ich nicht funktionieren, denn "GO" ist meines Wissens nach keine SQL-Anweisung und wird dir immer einen Fehler bringen.


----------



## BlackC (4. Aug 2010)

andiv hat gesagt.:


> Mit "GO" wirds denke ich nicht funktionieren, denn "GO" ist meines Wissens nach keine SQL-Anweisung und wird dir immer einen Fehler bringen.



Anscheinend schon. Das "Go" führt bei Microsoft den Befehl erst aus, so nach dem Motto:

Select SQL = "irgendwas"; (Sql-Anweisung)
Exec SQL (führe den SQL-Befehl aus)
Go (tu es jetzt)

Die Syntax hab ich von meinem Professor bekommen und etwas modifiziert. Das "Go" signalisiert das Ende eines Batches von Transact-SQL-Anweisungen an die SQL Server-Hilfsprogramme.

GO (Transact-SQL)


----------



## maki (4. Aug 2010)

Das GO gehört aber nicht in JDBC SQL Code, nur direkt am Server bzw. per MS Client.
Das Skript kannst du nicht 1:1 übernehmen.


----------



## andiv (4. Aug 2010)

Du solltest die Seiten auch durchlesen, die du verlinkst ;-)



> GO ist keine Transact-SQL-Anweisung; es ist ein Befehl, der von den sqlcmd- und osql-Hilfstprogrammen und vom SQL Server Management Studio-Code-Editor erkannt wird.
> 
> ...
> 
> Auf den ODBC- oder OLE DB-APIs basierende Anwendungen erhalten einen Syntaxfehler, wenn sie versuchen, einen GO-Befehl auszuführen. Die SQL Server-Hilfsprogramme senden nie einen GO-Befehl an den Server.


----------



## BlackC (4. Aug 2010)

sollte wohl wirklich meine verlinkten Seiten lesen. Hatte gehofft, einfach das Script ausführen zu können. Nun ja, hat sich wohl erledigt.

Danke für eure Hilfe


----------

