Solution #1 (duplicate positional parameters based on template
contents) looks to be somewhat complicated to implement.
Solution #2 (manipulate HQL AST and parameter list) doesn't work for
ICriteria / QueryOver.
Solution #3 (replace positional parameters with named) seems
potentially viable.
I have two "big" questions:
1. Are there cases where positional parameters are required, or is it
reasonable to always pre-process positional parameters into named
parameters? Along with this, what kind of parameters do the criteria
API and Linq generate? Are they always named parameters?
2. Why is it required that the type of a null parameter is known. In
other words, why is it necessary to call SetParameter with a type
overload? Is there any way to say "put NULL in the DB query and
disregard the type?"
I'll do some digging, but if anyone knows this stuff off-hand, that'd
be great to know.
Patrick Earl
On Aug 28, 2:55 am, Patrick Earl <[email protected]> wrote:
> I'm interested in implementing a function to duplicate the behavior of
> "IS NOT DISTINCT FROM" on SQL Server. On PostgreSQL, I'd simply use ?
> 1 IS NOT DISTINCT FROM ?2 as the function template. On SQL Server
> though, the template involves repeating the same argument: (?1 IS NULL
> AND ?2 IS NULL) OR (?1 IS NOT NULL AND ?2 IS NOT NULL AND ?1 = ?2)
>
> Unfortunately, when used with positional parameters, the function
> template is not processed correctly. The system duplicates the ?
> within the query, but it doesn't add another copy of the parameter to
> the parameter list. Here are some possible techniques for dealing
> with this issue:
>
> 1. Create another interface like ISQLParameterizedFunction that
> allows modification of the parameter list as well.
> 2. Allow dialects to access the HQL AST and parameter list and modify
> them directly.
> 3. Replace the positional parameters with named parameters.
>
> Sadly, I'm too tired for my brain to work properly. I just wanted to
> get these thoughts out there to see if anyone had any feedback or work-
> arounds.
>
> Patrick Earl