1

SQL クエリの一部として、次のコードを取得しました。

INSERT INTO [Database]  
 SELECT DISTINCT @ssId 
   FROM [Document_Map] 
  WHERE (LabelId IN (SELECT Tokens 
                       FROM StringSplitter(@sortValue, '|', 1))

このコード@SortValueは、整数 (LabelIdは int でもあります) または区切り文字で区切られた整数 (たとえば、SortValue 420|421| は 420 および 421 と比較されます) である限り正常に機能します。ただし、 の非整数値を含む機能を追加しています@sortValue。例: 420、ABC、および 421 と比較する420|ABC|421| 必要があります。

心配はいらない、と私は思った。そのクエリの最後の行を変更するだけです。

(LabelId IN (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1)) OR 
StringId IN (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1)))

残念ながら、@sortValue文字を入力するとエラーが発生します。の向こう側には決して到達しませんでしたor

いろいろ調べた結果、SQL が StringSplitter 関数からの文字列結果をキャストして、LabelId と比較していると最終的に判断しました。文字列の結果に数値のみが含まれることが保証されている場合は問題ありませんが、SQL は (当然のことながら) 数値以外の文字列を int にキャストすることを拒否し、エラーをスローします。

必要な機能を維持しながら、このエラーを回避する最も簡単な方法は何ですか? データベースの相互作用のため、タイプの変更がLabelId実行可能なオプションであるかどうかはわかりません。

4

3 に答える 3

4

DCPが言ったことを拡張して、次のコードを試してください。

(Convert(varchar(32),LabelId) IN (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1)) OR 
StringId IN (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1)))

パフォーマンスの問題に注意してください。WHERE句をキャストすると問題が発生する可能性があります...

于 2010-07-22T19:03:04.577 に答える
4

提案がありますが、質問もあります...

根本的な理由は、データ型の優先規則です。

私が得られないのは、数値列を文字列データと比較する理由です? 比較のために非数値データを送信する理由

文字列にキャストされた int LabelID "24" が "024" 文字列と比較されると、失敗します。ただし、文字列「024」は int にキャストすると「24」になり、一致します。どのような動作を望み、期待していますか?

壊れたスキーマを修正したり、ISNUMERIC を使用してデータを整理したりすることは理解できますが、意図的に文字列を送信しているようです。

とにかく、あなたの修正は

  • 送信内容に合わせて列のタイプを変更します
  • 列をキャストする
  • 文字列分割 ("StringSplitterToInt" など) またはクライアントでの比較から文字列を除外します。

モデルと実際のデータを反映するには1番、コードを修正するには3番をお勧めします...

于 2010-07-22T19:18:57.433 に答える
2

機能上の問題については、ISNUMERIC を試してください。

; WITH data (Foo) AS (
             SELECT '1'
   UNION ALL SELECT 'abc'
)
SELECT
   *
FROM data
WHERE ISNUMERIC(Foo) = 1;

さらに、Split 関数が他のテーブル (一般的な数値テーブルなど) を使用する場合は、SELECT ステートメントから分割部分を移動し、結果を一時テーブルに保存します。ステートメントの WHERE 部分でスキーマ バインディングを使用してテーブル値関数を呼び出すと、テーブルの各行に対して関数が呼び出される可能性があります (実際にそうすることがよくあります)。

于 2010-07-22T19:06:08.583 に答える