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) を使用すると、ドライバーがネイティブ クライアント ドライバー (vendorlib=sqlncli) を使用するように指示された場合と同じ動作が見られます。標準の Delphi ドライバーもネイティブ クライアント (sqlncli10.dll) を使用していると思います。
DevArt ドライバーに sqloledb をベンダー ライブラリとして使用するように指示すると、SQL プロファイラーで次のように表示されます。
exec sp_executesql N'INSERT INTO stagefm.dbo.artikelstamm (id) values (@P1)',
N'@P1 nvarchar(10)',
N'test'
ネイティブ クライアント SQL にもこのコードを期待していましたが、ネイティブ クライアントは単純な nvarchar(1) または char(3) フィールドに対しても常に nvarchar(4000) 変数を生成するようです。
ネイティブ クライアントの SQL 処理も最適化できますか?