ID: Q195979
The information in this article applies to:
With SQL Server's Quoted_Identifier set to Off, you may receive the following error:
Run-time error '-2147217900 (80040e14)':
Line 1: Syntax error near 'tablename'
This error occurs when you are using client-side cursors with the Microsoft
OLE DB Provider for SQL Server (SQLOLEDB). The error occurs on an ActiveX
Data Objects (ADO) recordset's Update method, and may occur on an AddNew
method.
With ADO client-side cursors, when you invoke an ADO recordset's AddNew or Update method, the OLE DB Provider prepares a SQL statement to send to SQL Server.
The Microsoft OLE DB Provider for SQL Server automatically quotes identifiers on an ADO recordset's Update method, and may quote identifiers on an AddNew method. Identifiers include table names and field names.
For example, updating the Titles table in the Pubs database with the following:
MyADORecordet.Update
The preceding would be prepared similar to the following:
UPDATE "titles" SET "title"='Hello World' WHERE "title_id"='3'
Note that the table name is in quotes, "titles", and that each field name
is in quotes, "title", "title_id", and so on.
If SQL Server's Quoted_Identifier option is set to Off, SQL Server will not recognize table names and field names enclosed in quotes.
The error "Syntax error near 'tablename'" occurs.
Following are two workarounds that allow you to set the quoted_identifier off and update records using ADO recordsets.
By default, the SQL Server ODBC driver quotes identifiers. However, you may configure the SQL Server ODBC driver to prepare SQL statements without quoted identifiers.
NOTE: You must use the SQL Server ODBC driver 2.65.0240 that ships with the SQL Server 6.5 Service Pack 2, or a later driver. Earlier SQL Server ODBC drivers do not have this capability.
- Add "QuotedID=No" in the ODBC connection string.
-or-
- Clear "Use ANSI Quoted Identifiers" in the Microsoft SQL Server
Data Source Name (DSN) Configuration.
1. Open the ODBC Administrator.
2. Open the User DSN or System DSN that you are using to connect
to your SQL Server database.
3. Click Next until you reach the dialog box with "Use ANSI
Quoted Identifiers".
4. Clear the check box next to "Use ANSI Quoted Identifiers".
5. Click Finish.
-OR-
For example, before opening an ADO Connection object named cn, use the following syntax:
cn.CursorLocation = adUseServer
section.
This behavior is by design.
ADO and the underlying OLE DB Provider are not aware of the SQL Server setting for the quoted_identifier, as set by the Transact SQL (T-SQL) statements:
-or-
The OLE DB Provider for SQL Server automatically quotes identifiers to ensure that if the identifier contains a special character, it will be quoted, as required by SQL Server. Note that the identifier does not have to actually contain a special character. It is only the possibility that causes the OLE DB Provider to quote the identifier. The OLE DB Provider for SQL Server does not have a property to explicitly specify that identifiers should or should not be quoted.
You can configure the OLE DB provider for ODBC to prepare SQL statements with or without quotes around identifiers. It uses the ODBC driver setting for QuotedID to determine whether to quote identifiers. For this reason, you may include the "QuotedID=Yes" or "QuotedID=No" option in the ODBC connect string, or select/deselect "Use ANSI Quoted Identifiers" in a DSN setup. Note that, by default, "QuotedID=Yes", instructing the ODBC to quote identifiers.
When you use ADO server-side cursors, cursors open on the server. The OLE DB Provider prepares the T-SQL sp_cursoropen, sp_cursorfetch, and related server-side cursor statements, instead of action queries.
The ADO Connection object's "Quoted Identifier Sensitivity" property shows the configuration a Provider uses to quote identifiers. The "Quoted Identifier Sensitivity" property is read-only, and only available at run- time after the Connection object has been opened. The "Quoted Identifier Sensitivity" property is only available for certain Providers, including the SQL Server and ODBC Providers. Since the property is read-only, you cannot use the "Quoted Identifier Sensitivity" property to configure a Provider to quote or not quote identifiers.
The ADO Connection object's read-only "Quoted Identifier Sensitivity" property will be as follows:
8 - When the Provider is configured to quote identifiers.
0 - When the Provider is configured not to quote identifiers.
NOTE: In the following code examples, substitute your server's name for servername in the connection strings.
This example uses the Pubs database that comes with SQL Server.
1. Create the user interface.
a. In Visual Basic, create a new Standard .exe project. Form1 is
created by default.
b. Add a Command button to Form1.
2. Set a Reference to either the Microsoft ActiveX Data Objects 1.5
Library, or to the Microsoft ActiveX Data Objects 2.0 Library.
3. Copy and paste the following code into the Click event of Command1:
Dim strcn As String
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
strcn = "Provider=SQLOLEDB;User ID=sa;Initial Catalog=Pubs;"
strcn = strcn & "Data Source=servername"
cn.ConnectionString = strcn
'Error occurs with Client-side cursors.
cn.CursorLocation = adUseClient
cn.Open
'Instruct SQL Server to turn off Quoted_Identifier.
cn.Execute "set quoted_identifier off"
rs.Open "select * from titles", cn, adOpenKeyset, adLockOptimistic
rs(1).Value = "Hello World"
'Error occurs on this line.
rs.Update
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
4. Test the application with the following:
a. Optionally, start the SQL Server SQLTrace program on the
server. SQLTrace is a standalone program in the SQL Server 6.5
group. SQLTrace allows you to view the SQL statements that
arrive at the SQL Server.
b. In Visual Basic, clicking the Command button at run-time causes
the following error:
Run-time error '-2147217900 (80040e14)':
Line 1: Syntax error near 'tablename'
c. If you are using SQLTrace, you may examine the T-SQL UPDATE
statement that the OLE DB Provider for SQL Server created. Note
that table names and field names appear in quotes.
You must use the SQL Server ODBC driver 2.65.0240 that ships with SQL Server 6.5 Service Pack 2, or a later driver.
Modify the connection string in the preceding example to the following:
strcn = "Provider=MSDASQL;driver=SQL Server;UID=sa;PWD=;"
strcn = strcn & "DATABASE=pubs;SERVER=servername;QuotedId=No"
Modify the cn.CursorLocation in the preceding example to the following:
cn.CursorLocation = adUseServer
If you are using the SQL Server SQLTrace program, you may examine the T-SQL
sp_cursor statements that the OLE DB Provider creates.
SQL Server Books Online; search on: "quoted_identifier".
For a discussion of configuring the SQL Server ODBC Driver with quoted_identifier on or off, please see the following article in the Microsoft Knowledge Base:
ARTICLE-ID: Q135533
TITLE : INF: Differences in SQL Behavior Between ODBC and ISQL
For additional information on the Microsoft ActiveX Data Objects, please
visit the following Web site:
http://www.microsoft.com/data/ado/
Additional query words:
Keywords : kbADO150 kbADO200 kbOLEDB kbSQLServ
Version : WINDOWS:1.5,2.0,5.0,6.0; WINNT:6.5
Platform : WINDOWS winnt
Issue type : kbprb
Last Reviewed: November 19, 1998