...or using a stored procedure along these lines:

ClassMethod RenameTable(oldName As %String, newName As %String) As %String [ SqlProc ]
   try {
      &sql(select %ID into :className
         from %Dictionary.ClassDefinition
         where SqlTableName = :oldName
      if SQLCODE set status = "Error: Table '" _ oldName _ "' not found." quit

      set classDef = ##class(%Dictionary.ClassDefinition).%OpenId(className)
      set classDef.SqlTableName = newName
      set saveStatus = classDef.%Save()
      set status = $case(saveStatus, 1: "OK", : "Error: " _ $system.Status.GetErrorText(saveStatus))
   } catch {
      set status = "Error: " _ $zerror
   return status

Note: This doesn't handle the special case where there is no 'SqlTableName' defined.

Hi Kishan,

The error message indicates that you're trying to access a property called 'value' in a collection of objects (%Collection.ListOfObj), but there is no such thing. My guess is that you're trying to access a property of one of the objects in the collection, in which case you need to use the 'GetAt' method of the collection object to specify which one you're after.

Here's more information on how to handle collections of objects.


Depending on the exact behavior you're after, the "binary follows" operator (]) may do the trick. For your two values, it yields the desired result, regardless of how you set them:

USER>set a = "1.0", b = "2.2" write a]b
USER>set a = "1.0", b = 2.2 write a]b
USER>set a = 1.0, b = 2.2 write a]b
USER>set a = 1.0, b = "2.2" write a]b


A couple of questions, in order to better understand what to recommend:

  1. Is the Caché instance where you're running the script an ECP client of the remote Caché instance?
  2. I can't quite parse "on just one server for all server". Is there a typo in there somewhere?



USER>set (^x, ^x("a"), ^x("b","c")) = ""
USER>set ref = "^x", count = $data(@ref)#2
USER>for count = count:1 set ref=$query(@ref) quit:ref=""
USER>write count

Perhaps someone has a more elegant way to make sure the root node gets counted...?


Hi Jiri,

The article you're referring to is from the early days of Ensemble, when we used an adapter library from a partner. This arrangement changed a few years ago, when the important needs of our users were sufficiently covered by our native adapter library. At that point, support for some non-critical interfaces was dropped.

I've looked around for examples of AS2 use with Ensemble, but so far I've drawn a blank. Perhaps others can comment, but failing that, my advice is that you speak to your local InterSystems representatives about your requirements and potential ways forward.

Kind regards,


Hi Steve,

Here are a couple of ways to do this:

1. Use ^%GSIZE to look at the size of your index global before and after you populate your new index. (If you look at the class definition, the global name is listed as "IndexLocation" in the "Storage" section.)

2. Map the index global to a separate database and look at the size of the CACHE.DAT.

The advantage of the second approach is that subscript-level mapping lets you selectively isolate indices.