1

MS SQL Server 2008 または 2008 R2 サーバーから値を読み取る C# プロジェクトに取り組んでいます。

クエリは次のようになります。

string charge="1234567";
string command = string.Format("SELECT * FROM tableX WHERE chargeField = '{0}' ", charge);

chargeField のタイプは nvarchar(50) です - 理由は聞かないでください - データベースを変更できません。また、エントリは別のツールによってデータベースに書き込まれますが、これも変更できません。場合によっては、chargeField の値に先頭または末尾のスペース文字が含まれていることがあるため、"1234567" != "1234567" であるため、クエリは何も返しません。

ただし、次のようにクエリを記述すると (' ' なし):

string command = string.Format("SELECT * FROM tableX WHERE chargeField = {0} ", charge);

できます。なぜこれが機能するのか - データベース フィールドが文字列であることを示すために '' 記号は必要ないのですか? すべてのクエリを安全に変更できますか? これはMS SQL Serverの「機能」であり、ここで正確に何が起こるのですか?

編集

次を使用して問題を解決しました。

string command = string.Format("SELECT * FROM tableX WHERE RTRIM(LTRIM(chargeField)) = {0} ", charge);

ありがとう。

4

2 に答える 2

1
于 2012-12-06T11:50:53.463 に答える
1

SQL Server は、それに応じてフィールドを変換しようとします。引用符を使用しないと、数値を渡すことになるため、SQL Server は値を数値に変換しようとしchargeFieldます。これは先頭にスペースがあっても機能します。

chargeField値が含まれている場合、これは機能しません12345a。これにより、変換エラーが発生します。テーブル内の 1 つのレコードにこのような値が含まれていれば、エラーが発生します。

安全のために、クエリを次のように変更してください

... WHERE LTRIM(chargeField) = '{0}'

ただし、これにより、フィールドのインデックスが使用されなくなる可能性があることに注意してください。まだできることは、トリガーを使用して の値で埋められる追加の列を作成し、LTRIM(chargeField)その列にインデックスを付けて、WHEREそれに応じて句を調整することです。

于 2012-12-06T11:49:21.743 に答える