2016-10-01 165 views
0

我得到一個錯誤信息說附近有語法錯誤sys.objects中「

com.microsoft.sqlserver.jdbc.SQLServerException:附近有語法錯誤 'SYS'。

而這通常意味着我輸入的SQL查詢是錯誤的或者我缺少語法。而且我很肯定,我使用這個SQL查詢是正確的:

public static Vector<Vector<String>> getKeys() throws SQLException { 
    Vector<Vector<String>> vs = new Vector<Vector<String>>(); 
    Connection con = Dal2.getConnection(); 
    Statement stm = con.createStatement(); 
    ResultSet rSet; 
    String sqlString = "SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint," 
      +"SCHEMA_NAME(schema_id) AS SchemaName," 
      + "OBJECT_NAME(parent_object_id) AS TableName," 
      +"type_desc AS ConstraintType" 
      +"FROM sys.objects" 
      +"WHERE type_desc IN ('FOREIGN_KEY_CONSTRAINT','PRIMARY_KEY_CONSTRAINT')"; 

    try{ 
     rSet = stm.executeQuery(sqlString); 
     while(rSet.next()){ 
      Vector<String> v = new Vector<String>(); 
      for(int i=1; i <= v.size(); i++){ 
       System.out.println(rSet.getString(i) + "\n"); 
     //     v.add(rSet.getString(i)); 
      } 
      } 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    return vs; 

正如你可以看到我想要打印出來的SQL時,我使用的方法的Java控制檯上的結果集。但我不斷收到語法錯誤。我試着在SQL Server中的SQL查詢和正常工作:

SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint, 
     SCHEMA_NAME(schema_id) AS SchemaName, 
     OBJECT_NAME(parent_object_id) AS TableName, 
     type_desc AS ConstraintType 
FROM sys.objects 
WHERE type_desc IN ('FOREIGN_KEY_CONSTRAINT','PRIMARY_KEY_CONSTRAINT') 
+3

在'FROM'和'WHERE'之前插入空格。 – saka1029

+0

另外,不要使用'矢量'。 – chrylis

回答

0

sqlString缺少空白字符在兩個地方爲您的查詢

String sqlString = "SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint," 
     + "SCHEMA_NAME(schema_id) AS SchemaName," 
     + "OBJECT_NAME(parent_object_id) AS TableName," 
     + "type_desc AS ConstraintType " // <-- here 
     + "FROM sys.objects " // <-- here 
     + "WHERE type_desc IN ('FOREIGN_KEY_CONSTRAINT','PRIMARY_KEY_CONSTRAINT')"; 

TL;博士目前您的查詢會評估(部分)ConstraintTypeFROM sys.objectsWHERE

1

連接後的字符串看起來是這樣的:

SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint,SCHEMA_NAME(schema_id) AS SchemaName,OBJECT_NAME(parent_object_id) AS TableName,type_desc AS ConstraintTypeFROM sys.objectsWHERE type_desc IN ('FOREIGN_KEY_CONSTRAINT','PRIMARY_KEY_CONSTRAINT') 

注意ConstraintTypeFROM sys.objectsWHERE部分。它缺少空格,導致SQL語法錯誤。

通常,將每個SQL行的最後一個空格放入最終查詢中是個不錯的主意。這樣您就不必考慮換行符處的空格:

String sqlString = "SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint, " // <<== Space 
     +"SCHEMA_NAME(schema_id) AS SchemaName, "      // <<== Space 
     + "OBJECT_NAME(parent_object_id) AS TableName, "     // <<== Space 
     +"type_desc AS ConstraintType "         // <<== Space 
     +"FROM sys.objects "            // <<== Space 
     +"WHERE type_desc IN ('FOREIGN_KEY_CONSTRAINT','PRIMARY_KEY_CONSTRAINT')";