Thank you for your suggestion. No, the connection string used with other tools (e.g. Microsoft ssms) are slightly different. With other tools connection string specify all the details. Here I'm using Windows ODBC to define the DSN and pass in the DSN name via the DSN= parameter. I did this because I came across another article somewhere, where someone else had run into problem with SSL / TLS and he ended up defining an ODBC DSN, then passing both the DSN as well as the server name. I use 64bit Perl.
Having said that I've figured out what my problem is now. Even though I upgraded my ODBC driver and defined my new DSN based on the new ODBC driver (which supports TLS1.2) my driver specification was still wrong like this:
"dbi:ODBC:Driver={SQL Server}"
I mistakenly assumed that the "dbi:ODBC:Driver={SQL Server}" is generic and defined somewhere within DBI. However having searched the DBI::ODBC package and not able to see where the driver is specified I thought maybe I need to specify the exact driver name as appeared under the list of drivers in the Windows ODBC applet, and that fixed it. So my updated code is like this (and it works now):
"dbi:ODBC:Driver={ODBC Driver 17 for SQL Server}"
| [reply] [d/l] [select] |