4

約 80 列の大きな CSV を SQL Server 2008 テーブルにインポートするユーティリティ C# を作成しています。

CSV はインポート前に操作が必要です。たとえば、いくつかの列をマージしたり、日付を変換したりします。したがって、次のINSERT INTOようなステートメントを作成しています。

INSERT INTO table VALUES ('abc','blah',...)

私の問題は、テーブルに type の列が含まれていることUNIQUEINDENTIFIERです。INSERT INTO値のコレクションを取り、値の文字列を返す既存のメソッドを再利用して、アポストロフィを処理したり、インジェクション攻撃を取り除いたりして、ステートメントに直接ポップしたいので、これは問題です。

UNIQUEIDENTIFIERこのメソッドに渡すことができるa の有効なリテラルを生成する方法はありますか? を試したところGuid.NewGuid.ToString()、 so のようなリテラルが得られました'bfdb0297-2018-4555-ac12-88064944a671'が、クエリでデータ切り捨て例外が発生してエラーが発生しました。また、ハイフンを削除してみました。32 個の 16 進文字が機能すると予想していました。

パラメータ化されたクエリが正しい方法であることはわかっていますが、それは既存のコードの大幅な再作業を意味します。

私は C# がかなり得意で、SQL Server についてはブラフに値します。

[編集]

私はいくつかのことをしました。最初に、その列を Guid.NewGuid で更新するクエリを書きました。したがって、切り捨てエラーはそこからではありません。SQL Server のリファレンスを確認すると、id 列の不正な値から切り捨てエラーが返されたのではなく、無効な値のエラーであることがわかりました。また、重要な作業は正しく行わないことの言い訳にはならないという Aaron のコメントも考慮に入れ、現在は正常に機能するパラメーター化されたクエリを生成するメソッドを作成しました。

回答者の皆様、どうもありがとうございました。

4

3 に答える 3

14

SQL ServerリテラルUNIQUEIDENTIFIERは次のようになります。

SELECT {guid'8DEC377B-6D75-424B-AE01-D3727993C7F6'}

ドキュメントに見られるように:

これは、キーワードGUIDとそれに続くレジストリ形式として知られる形式の 16 進数で構成されるシーケンスです:単一引用符で囲まれた 8-4-4-4-12。

誰もこれを知らないようです。これは、実際に文字通りの GUID/UUID を持つ最初の言語です。

于 2015-10-05T19:26:24.577 に答える
3

これはうまくいくので:

DECLARE @x TABLE(y UNIQUEIDENTIFIER); 

INSERT @x SELECT 'bfdb0297-2018-4555-ac12-88064944a671';

そして、これは現在取得している一般的なエラー メッセージで失敗します。

DECLARE @x TABLE
(
  y UNIQUEIDENTIFIER,
  z CHAR(10)
); 

INSERT @x 
  SELECT 'bfdb0297-2018-4555-ac12-88064944a671',
         '0123456789A';

結果:

メッセージ 8152、レベル 16、状態 14、行 7
文字列またはバイナリ データが切り捨てられます。
ステートメントは終了されました。

エラーが実際にUNIQUEIDENTIFIER列で発生しているかどうかを質問する必要があります。(a) テーブル内の別の列でエラーが発生しており、すべての文字列の長さを確認していないか、(b) テーブルにトリガーがあり、そこでエラーが発生していると思われます。

文字列を一緒に投げるだけでなく、適切なパラメーターを使用すると、各パラメーターがテーブルにあるとおりに正確に定義されていることを確認できます。

于 2012-06-26T16:58:12.350 に答える
1

SQL INSERT ステートメントを変更できますか? その列に固有のものを使用するように設定してみませんか?

xxx, 
xxx,
convert(uniqueidentifier, 'A8AC30E7-B984-4E29-A97A-A434F2B2AB7C'), 
xxx, 
xxx
于 2012-06-26T16:56:13.487 に答える