在将我们的一些旧应用程序从TdOleDb提供程序转换为.NET提供程序时,我发现了支持的SQL中的许多差异。我遇到的两个例子之一是TdOleDb如何允许这样做:
substring('abcd',2,2)
然而,.NET提供程序会抛出异常。您必须将其转换为Teradata的两个支持的子字符串函数之一,如下所示:
substr('abcd',2,2)
substring('abcd' from 2, 2)
有没有办法确定解析器在这两个提供程序之间的工作方式的所有已知差异?我们当然计划测试所有内容,但是我们可能会错过一两个SQL执行,因此能够搜索我们的应用程序以获得不受支持的SQL将是一个很大的帮助。
修改
这是我发现两个提供者行为不同的另一个例子。这是使用CommandType.StoredProcedure
执行宏的旧OleDb代码:
cmdQuote = New OleDb.OleDbCommand
cmdQuote.Connection = conQuote
cmdQuote.CommandType = CommandType.StoredProcedure
cmdQuote.CommandText = "mydb.mymacro"
当我将所有OleDb类更改为.NET提供程序的类时,Teradata会抛出此异常:
[Teradata Database] [5494] 'mymacro' is not a stored procedure
要使它与.NET提供程序一起使用,我必须将其转换为:
cmdQuote = New TdCommand
cmdQuote.Connection = conQuote
cmdQuote.CommandText = "execute mydb.mymacro(?)"
cmdQuote.Parameters.Add(MyParam)