web-dev-qa-db-ja.com

SQLサーバー、デフォルトですべてのクエリのNプレフィックスをユニコードとして設定

データベースにNプレフィックスを使用するms sqlサーバーのオプションはありますか?私のアプリケーションには多くのクエリがあり、それらのどれもnvarcharフィールドにNプレフィックスを使用していません。これらすべてにNを設定する必要があり、実行に時間がかかります。私の照合順序はPersian_100で、Unicode(Nプレフィックス)が必要なので、アドバイスをいただければ幸いです。

select * from table1 where field1=N'حمید' ;

クエリでNプレフィックスをスキップしたいのですが、すべてのタイプのクエリのユニコードとして機能します。

6
Hamid

いいえ、これを行う方法はありません。

文字列リテラル構文内でそれをoffにする方法が必要になるため、希望どおりのオプションは非常に混乱します。データ型を選択する際に注意すべきその他の考慮事項(ストレージサイズなど)があるため、このような設定は非常に危険です。


パラメータ化されたT-SQLステートメントをSQL Serverに送信する.NETアプリケーションに関しては、.NET String が本質的にUnicodeをサポートし、使用して構築されたため、フレームワークがこれを処理しますその仮定。これは、ORMタイプのライブラリが適切にプログラムされている場合にも当てはまります。

次のコードスニペットを検討してください。

IDbCommand cmd = connection.CreateCommand();
cmd.CommandText = @"SELECT * FROM sys.server_principals WHERE name = @name";

IDbDataParameter param = cmd.CreateParameter();
param.DbType = DbType.String;
param.ParameterName = "@name";
param.Value = "dbo";
cmd.Parameters.Add(param);

IDataReader dr = cmd.ExecuteReader();

実際にSQL Serverに送信されるのは次のとおりです(明確にするために改行が追加されています)。

exec sp_executesql N'SELECT * FROM sys.server_principals WHERE name = @name',
    N'@name nvarchar(3)',@name=N'dbo'

フレームワークがパラメーターにUnicode型を自動的に使用したことがわかります(長さ3は完全に別の議論です...)。

コードを変更する必要があるのは、SQLクエリがパラメーター化されていない(またはパラメーター化できない、つまりDDLである)状況です。つまり、パラメーターが文字列に直接連結されているか、文字列定数が含まれているクエリです。動的SQLを使用するときにSQLインジェクションの問題を回避する方法の例については、私の回答 こちら を参照してください。

4
Jon Seigel