2013-03-27 2 views
1

Я получил SQL для DB2 следующих сокращенного формата:DB2 Параметр связывание для буквальных сравнений

Select ... 
From ... 
Where ... ((COL1 IS NULL) And ('' = ?)) ... 
Order By ... 

Грубой целью этого SQL является возвращение Null записей, если вход против COL1 пустой.

Однако, если я пытаюсь связать «RED» с заполнителем, я получаю ошибку CLI0109E, указывающую «усечение строковых данных». Я считаю, что происходит то, что DB2 решила, что «литерал в SQL» является столбцом длины 0, поэтому попытка сравнить связанный параметр длины 3 (в случае «RED») вызывает ошибку усечения. Это имело бы смысл.

Если я сменил SQL на: ((COL1 IS NULL) And ('{10 spaces}' = ?)), он отлично работает.

Если я сменил SQL на: ((COL1 IS NULL) And (CAST('' AS VARCHAR(32767)) = ?)), он отлично работает.

Есть ли параметр драйвера или параметр SQLBindParameters, который мне не хватает, что приводит к тому, что DB2 интерпретирует '' как столбец нулевой длины?

Я запускаю тот же SQL через Oracle и SQLServer, и они отлично работают, что говорит мне, что они интерпретируют «как нечто иное», и, возможно, по умолчанию обрабатывают все литералы в SQL как VARCHAR (32767) или что-то в этом роде.

Спасибо за любую помощь.

ответ

1

Ответ на этот вопрос, похоже, заключается в том, что DB2 работает при определении типа данных и размера для литерала.

Из того, что я выяснил, концепции, которые здесь понимают, кажутся неявными и явными CASTing. Поскольку явный CAST не был предоставлен для пустого строкового литерала, и в правой части предиката сравнения не было никакой дополнительной информации (имеется только местозаполнитель параметров и не содержит определенной информации о размере), DB2 будет неявно отбрасывать размер буква, в этом случае CHAR (1) (или, может быть, VARCHAR (1), я не совсем уверен в этом).

Таким образом, это не проблема с драйвером CLI или quirk, а также проблема SQLBindParameters. Явный CAST CAST ('' как VARCHAR (nn)) представляется правильным решением, чтобы избежать ошибки CLI0109E.

Для чего стоит, основываясь исключительно на моем опыте, Oracle и SQLServer, похоже, ведут себя иначе, чем DB2 при запуске одного и того же SQL на этих платформах. Их неявные CAST, отсутствующие в любой доступной информации о размерах, на которых можно рисовать, кажутся VARCHAR (большими). Но явный CAST также работает так же хорошо для них.