Re: VARCHAR(max) in SP output params with TDS>=7.2 and rpc API

Frediano Ziglio <[email protected]>
Newsgroups gmane.comp.db.tds.freetds
Message-ID <CAHt6W4dXx-6W09LBqxSb_DoUt+2aBry1b5PvnrM8eqCUXHd_5g@mail.gmail.com>
2014-11-23 18:31 GMT+00:00 Ramiro Morales <[email protected]>:
> Hi all,
>
> I've found FreeTDS master can't handle the new in TDS 7.2 ability to
> handle values longer than 8000 chars.
>
> I've opened a merge request which adds tests that show the failure:
>
> https://gitorious.org/freetds/freetds/merge_requests/32
>
> I tried to modify the RPC parameter handling rpc API code to get this
> working by following what can be read at
> http://www.freetds.org/tds.html#login7 ('Types' sub-section):
>
> There is a call-out in that table for the XSYBVARBINARY, XSYBVARCHAR
> and XSYBNVARCHAR data types that reads:
>
> "* Under TDS 7.2+ these types allow size to be -1, representing
> varchar(max), varbinary(max) and nvarchar(max)."
>
> Unfortuately my attemps were unsuccessful. I suspect what is described
> there doesn't apply to the RPC SP API.
>
> Any hints on how these data types need to be represented on the wire
> are welcome. I'd be willing to try to implement the required changes.
>
> Regards,
>
> PS: My use case is about output parameters, but it's possible input
> ones also need work. See https://github.com/pymssql/pymssql/issues/275
>


Hi Ramiro,
  I'm trying to have a look at your patch. I didn't fix the
compatibility with Sybase but I did some test and I came up with some
patches. One problem is that there are not strictly speaking output
parameters, a parameter can be input or input/output. The trick to use
NVARCHAR was to be able to insert any character into database but of
course you limit to 4000 instead of 8000. I tried at first to use
VARCHAR(MAX) as it has no limit, server returns it but it put these
field last. Not a big deal but could break application which expect
field in a given order (like our test). See
https://gitorious.org/freetds/mars-freetds/commits/856eed7d1d529377db33f452204aa344c8d778ad
branch, it's messy but I put some changes. Basically the rule I turned
up is: if VARCHAR is up to 4000 use NVARCHAR, if not use VARCHAR. I
also changed your sql script to use char/nchar function so file
encoding is not an issue (it tuned out that file was utf-8 but client
iso8859-1 so the single character you specified turned out to be 2
characters).

You should also use SYBVARCHAR and not 231, our dblib convert every
string and should not deal with wide characters.

I tried to switch client to utf-8 (commented out) and characters are
returned correctly but test fail for lengths returned. I'm not sure
that returning twice the length is fine.

Frediano
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.