Re: Proper query to create table

Igor Korot <[email protected]> Tue, 24 Jul 2018 12:44:20 -0500
Newsgroups gmane.comp.db.tds.freetds
Message-ID <CA+FnnTyten8mpTVcKKQS8XMbXL+5SkD+91rGtPuk+0JucAwbdw@mail.gmail.com>
Hi, Matthew (and list),

On Mon, Jul 23, 2018 at 11:34 AM, Igor Korot <[email protected]> wrote:
> Hi, Matthew,
>
> On Mon, Jul 23, 2018 at 11:22 AM,  <[email protected]> wrote:
>> Sorry Igor if I wasn't clear.
>>
>> I ran this from SAP's isql as your original e-mail seemed to me to be more a problem with getting the command right than FreeTDS.
>
> Yes, you are correct. It is a syntax issue.
>
>>
>> So, from isql and now on ASE 16 the following works (adopting more your syntax):
>>
>> if not exists (select 1 from sysobjects where name = "test" and type = "U")
>>     exec("create table test (test int not null)")
>>
>> if not exists (select 1 from sysindexes where id = object_id("test") and name = "I1")
>>      exec("create index I1 on test (test)")
>>
>> I ran it 20 times, obviously the first time when the table and index don't exist and the following ones when it does :-)
>
> That's weird.
> Does this mean we have a bug in the freeTDS ODBC driver? Frediano?
>
> As I said - I ran it from the unixODBC DM and on the second try got
> "Could not SQLExecute".

After inspecting my code more closely I found I was checking the
tempdb tables and not the actual ones.
Stupid me. ;-) I guess I needed a fresh pair of eyes or it was too late.

But now I have a more interesting question.

Is there a way to add catalog/schema to the "SELECT 1 FROM sysindexes..." query?

Thank you.

>>
>> Cheers,
>>
>> Matt.
>>
>> July 23, 2018 5:20 PM, "Igor Korot" <[email protected]> wrote:
>>
>>> Hi, Matthew,
>>>
>>> On Mon, Jul 23, 2018 at 9:31 AM, <[email protected]> wrote:
>>>
>>>> This works for me on 15.7:
>>>>
>>>> create table test (test int not null)
>>>>
>>>> declare @i varchar(8000)
>>>>
>>>> select @i = "create index I1 on test (test)"
>>>>
>>>> if not exists (select 1 from sysindexes where id = object_id("test") and name = "I1")
>>>> exec(@i)
>>>
>>> How many times did you run it?
>>> When I tried to execute:
>>>
>>> IF NOT EXISTS(SELECT o.name, i.name FROM tempdb..sysobjects o,
>>> tempdb..sysindexes i WHERE o.id = i.id AND o.name='abcattbl' AND
>>> i.name='abcattbl_tnam_ownr') EXECUTE("CREATE INDEX abcattbl_tnam_ownr
>>> ON abcattbl(abt_tnam ASC, abt_ownr ASC)")
>>>
>>> when the index already been created, I got:
>>>
>>> "Could not SQLExecute"
>>>
>>> And I have Sybase 16.0 installed on Linux Gentoo.
>>> Tried the query on isql from unixODBC w/freeTDS driver.
>>>
>>> Thank you.
>>>
>>>> Cheers,
>>>>
>>>> Matt.
>>>>
>>>> July 23, 2018 3:02 PM, "Igor Korot" <[email protected]> wrote:
>>>>
>>>>> And following statement also fails:
>>>>>
>>>>> IF NOT EXISTS(SELECT o.name, i.name FROM tempdb..sysobjects o,
>>>>> tempdb..sysindexes i WHERE o.id = i.id AND o.name='abcattbl' AND
>>>>> i.name='abcattbl_tnam_ownr') EXECUTE("CREATE INDEX abcattbl_tnam_ownr
>>>>> ON abcattbl(abt_tnam ASC, abt_ownr ASC)")
>>>>>
>>>>> "Could not SQLExecute"
>>>>>
>>>>> Log says "Index already exists"
>>>>>
>>>>> Thank you.
>>>>>
>>>>> On Mon, Jul 23, 2018 at 5:57 AM, Igor Korot <[email protected]> wrote:
>>>>
>>>> Hi,
>>>>
>>>> On Mon, Jul 23, 2018 at 2:48 AM, Frediano Ziglio <[email protected]> wrote:
>>>> 2018-07-22 7:57 GMT+01:00 Igor Korot <[email protected]>:
>>>>
>>>> Hi, ALL,
>>>> I'm trying to execute following query:
>>>>
>>>> query1 = L"IF NOT EXISTS(SELECT 1 FROM sysobjects WHERE name =
>>>> 'abcatcol' AND type = 'U') CREATE TABLE abcatcol( <field_list>))";
>>>>
>>>> Unfortunately it fails.
>>>> If the table does not exist I'm getting 100 (SQL_NO_DATA) from the ODBC
>>>> driver.
>>>> And if the table does exist, I'm getting -1 with the error:
>>>>
>>>> "The table already exists".
>>>>
>>>> Is there a way to do this in 1 shot? Or I will have to do a conditional
>>>> for Sybase to make it in 2 queries?
>>>>
>>>> Please advise.
>>>>
>>>> Thank you.
>>>> This works for mssql:
>>>>
>>>> if object_id('test123') is null create table test123(i int)
>>>>
>>>> What about this one:
>>>>
>>>> CREATE INDEX IF NOT EXISTS abcattbl_tnam_ownr ON abcattbl(\"abt_tnam\"
>>>> ASC, \"abt_ownr\" ASC)
>>>>
>>>> ?
>>>>
>>>> It is on Sybase 16.
>>>> It says "Syntax error on the 'IF'".
>>>>
>>>> Thank you.
>>>>
>>>> Frediano
>>>> _______________________________________________
>>>> FreeTDS mailing list
>>>> [email protected]
>>>> https://lists.ibiblio.org/mailman/listinfo/freetds
>>>>> _______________________________________________
>>>>> FreeTDS mailing list
>>>>> [email protected]
>>>>> https://lists.ibiblio.org/mailman/listinfo/freetds
>>>>
>>>> _______________________________________________
>>>> FreeTDS mailing list
>>>> [email protected]
>>>> https://lists.ibiblio.org/mailman/listinfo/freetds
>>>
>>> _______________________________________________
>>> FreeTDS mailing list
>>> [email protected]
>>> https://lists.ibiblio.org/mailman/listinfo/freetds
>> _______________________________________________
>> FreeTDS mailing list
>> [email protected]
>> https://lists.ibiblio.org/mailman/listinfo/freetds