在我的 MS SQL Server (2008R2) 上定义的表定义如下:
create table stagefm.dbo.article (id nvarchar(10));
我通过 dbexpress (dbxmss.dll) 向我的 MS SQL Server 发送一个简单的插入语句:
Q.SQL.Text:= 'INSERT into stagefm.dbo.article (id) values (':id')';
Q.Prepared:= true;
Q.ParamByName('id').AsString:= 'test';
Q.ExecSQL;
使用 SQL Profiler,我看到在我的服务器上执行了以下 SQL:
exec sp_executesql N'INSERT INTO stagefm.dbo.artikelstamm (id) values (@P1)',
N'@P1 nvarchar(4000)',
N'test'
当我使用第三方 dbexpress 驱动程序 (DevArt dbxsda40.dll) 时,当指示驱动程序使用 Native Client 驱动程序 (vendorlib=sqlncli) 时,我可以看到相同的行为。我相信标准的 Delphi 驱动程序也使用本机客户端(sqlncli10.dll)。
现在,当我指示 DevArt 驱动程序使用 sqloledb 作为供应商库时,我可以使用 SQL Profiler 看到以下内容:
exec sp_executesql N'INSERT INTO stagefm.dbo.artikelstamm (id) values (@P1)',
N'@P1 nvarchar(10)',
N'test'
我也希望本机客户端 SQL 的代码也如此,但本机客户端似乎总是生成 nvarchar(4000) 变量,即使对于简单的 nvarchar(1) 或 char(3) 字段也是如此。
是否也可以优化 Native 客户端的 SQL 处理?