1

I need to create a view with an order by-clause with sequel, tinytds and MSSQL

When I do so, I get the error

TinyTds::Error: The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified. (Sequel::DatabaseError)

My examplecode:

require 'sequel'

DB = Sequel.tinytds(
                    :host     =>  'server', 
                    :database=> 'DB',
                )     
#Remove data from previous test
DB.drop_table(:testtab1) if DB.table_exists?(:testtab1)
DB.drop_view(:v_testtab1) rescue Sequel::DatabaseError
DB.drop_view(:v_testtab2) rescue Sequel::DatabaseError

DB.create_table(:testtab1){
  primary_key :id
  field :a, :type => :nvarchar, :size => 10
  field :b, :type => :nvarchar, :size => 10
}

#Here the error comes up
#"SELECT * FROM `testtab1` ORDER BY `b`"
DB.create_view(:v_testtab1, DB[:testtab1].order_by(:b))

See solution on SQL-side is easy. Instead of the

SELECT * FROM `testtab1` ORDER BY `b`

I need a

SELECT top 100 percent * FROM `testtab1` ORDER BY `b`

I found a solution with an additional obsolete column (without the column dummy I get an invalid comma):

sel = DB[:testtab1].select(Sequel.lit('top 100 percent "" as dummy'), *DB[:testtab1].columns)
#SELECT top 100 percent "" as dummy, [ID], [A], [B] FROM [TESTTAB1]
DB.create_view(:v_testtab2, sel.order_by(:b))

A similar solution can be made with limit:

#Take a big number to get all entries.
#DB[:testtab1].count would take the number in moment of view creation, not usage.
sel = DB[:testtab1].limit(99999999999) 
#SELECT TOP (99999999999) * FROM [TESTTAB1]
DB.create_view(:v_testtab3, sel.order_by(:b))

But I'm looking for a nicer solution. Is there another better possibility?

If it is important:

  • Ruby 2.1
  • Sequel 4.19
  • tiny_tds-0.6.2-x64-mingw32
  • MSSQL 10.50.2500.0, 64 bit
Community
  • 1
  • 1
knut
  • 27,320
  • 6
  • 84
  • 112
  • See my answer on **[SQL Server Query Error -ORDER BY clause is invalid in views](https://stackoverflow.com/questions/36697511/sql-server-query-error-order-by-clause-is-invalid-in-views/61702593#61702593)**. – Murat Yıldız May 09 '20 at 19:36

0 Answers0