TinyTds::Error: Procedure expects parameter
TinyTds::Error: Procedure expects parameter
给出以下 ruby:
sql2 = 'SELECT (CASE WHEN freq = 0 THEN \'pass\' ELSE \'fail\' END) FROM (
SELECT COUNT(*) freq FROM Grant_Award WHERE Grant_Award.org_ticker IS NULL )x;'
pp ActiveRecord::Base.connection.select_all(sql2)
sql1 = "SELECT (CASE WHEN freq = 0 THEN 'pass' ELSE 'fail' END) FROM ( SELECT COUNT(*) freq FROM Grant_Award WHERE Grant_Award.org_ticker IS NULL )x;"
pp ActiveRecord::Base.connection.select_all(sql1)
sql0 = File.readlines(File.join(BASE,'db','scripts','test','pass_or_fail.sql'))
sql = (sql0.map {|l| l.strip}).join(' ')
pp sql
pp ActiveRecord::Base.connection.select_all(sql)
以上产生以下结果:
#<ActiveRecord::Result:0x38b0ce0
@column_types={},
@columns=[""],
@hash_rows=nil,
@rows=[["pass"]]>
#<ActiveRecord::Result:0x38b5ae0
@column_types={},
@columns=[""],
@hash_rows=nil,
@rows=[["pass"]]>
"SELECT (CASE WHEN freq = 0 THEN 'pass' ELSE 'fail' END) FROM ( SELECT COUNT(*) freq FROM Grant_Award WHERE Grant_Award.org_ticker IS NULL )x;"
C:/Ruby193/lib/ruby/gems/1.9.1/gems/activerecord-sqlserver-adapter-4.2.2/lib/active_record/connection_adapters/sqlserver/database_statements.rb:336:in `each': TinyTds::Error: Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.: EXEC sp_executesql 'SELECT (CASE WHEN freq = 0 THEN ''pass'' ELSE ''fail'' END) FROM ( SELECT COUNT(*) freq FROM Grant_Award WHERE Grant_Award.org_ticker IS NULL )x;' (ActiveRecord::StatementInvalid)
前两次尝试执行 sql return 就好了。第三个,从一个文件读入一个数组,然后加入,炸弹。我知道这一定与字符串的处理有关。但是我想不通。
我做错了什么?为什么它(tinytds 或 activerecord?)认为这是一个存储过程?
我想做的是将一大堆sql脚本放在一个文件夹中,然后一个一个地执行它们。
详细信息:ruby1.9.3、activerecord (4.2.0) 和 tiny_tds (0.6.2-x86-mingw32)
我觉得文件导入生成的语句应该是:
SELECT (CASE WHEN freq = 0 THEN 'pass' ELSE 'fail' END) FROM ( SELECT COUNT(*) freq FROM Grant_Award WHERE Grant_Award.org_ticker IS NULL );"
我认为语句末尾的 x 是导致错误的原因,想知道这是否误入了您的其他行。
我今天早上醒来,意识到这一定与磁盘上文件的字符集有关。以下是一个解决方案[无需更改查询]:
ActiveRecord::Base.connection.select_all(sql0.join(" ").encode("UTF-8"))
我提交的时候强制字符集为utf-8,现在一切正常。
证明:
#<ActiveRecord::Result:0x3bede68
@column_types={},
@columns=[""],
@hash_rows=nil,
@rows=[["pass"]]>
#<ActiveRecord::Result:0x3bf2c68
@column_types={},
@columns=[""],
@hash_rows=nil,
@rows=[["pass"]]>
"SELECT (CASE WHEN freq = 0 THEN 'pass' ELSE 'fail' END) FROM ( SELECT COUNT(*) freq FROM Grant_Award WHERE Grant_Award.org_ticker IS NULL )x;"
#<ActiveRecord::Result:0x3bf5410
@column_types={},
@columns=[""],
@hash_rows=nil,
@rows=[["pass"]]>
给出以下 ruby:
sql2 = 'SELECT (CASE WHEN freq = 0 THEN \'pass\' ELSE \'fail\' END) FROM (
SELECT COUNT(*) freq FROM Grant_Award WHERE Grant_Award.org_ticker IS NULL )x;'
pp ActiveRecord::Base.connection.select_all(sql2)
sql1 = "SELECT (CASE WHEN freq = 0 THEN 'pass' ELSE 'fail' END) FROM ( SELECT COUNT(*) freq FROM Grant_Award WHERE Grant_Award.org_ticker IS NULL )x;"
pp ActiveRecord::Base.connection.select_all(sql1)
sql0 = File.readlines(File.join(BASE,'db','scripts','test','pass_or_fail.sql'))
sql = (sql0.map {|l| l.strip}).join(' ')
pp sql
pp ActiveRecord::Base.connection.select_all(sql)
以上产生以下结果:
#<ActiveRecord::Result:0x38b0ce0
@column_types={},
@columns=[""],
@hash_rows=nil,
@rows=[["pass"]]>
#<ActiveRecord::Result:0x38b5ae0
@column_types={},
@columns=[""],
@hash_rows=nil,
@rows=[["pass"]]>
"SELECT (CASE WHEN freq = 0 THEN 'pass' ELSE 'fail' END) FROM ( SELECT COUNT(*) freq FROM Grant_Award WHERE Grant_Award.org_ticker IS NULL )x;"
C:/Ruby193/lib/ruby/gems/1.9.1/gems/activerecord-sqlserver-adapter-4.2.2/lib/active_record/connection_adapters/sqlserver/database_statements.rb:336:in `each': TinyTds::Error: Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.: EXEC sp_executesql 'SELECT (CASE WHEN freq = 0 THEN ''pass'' ELSE ''fail'' END) FROM ( SELECT COUNT(*) freq FROM Grant_Award WHERE Grant_Award.org_ticker IS NULL )x;' (ActiveRecord::StatementInvalid)
前两次尝试执行 sql return 就好了。第三个,从一个文件读入一个数组,然后加入,炸弹。我知道这一定与字符串的处理有关。但是我想不通。
我做错了什么?为什么它(tinytds 或 activerecord?)认为这是一个存储过程?
我想做的是将一大堆sql脚本放在一个文件夹中,然后一个一个地执行它们。
详细信息:ruby1.9.3、activerecord (4.2.0) 和 tiny_tds (0.6.2-x86-mingw32)
我觉得文件导入生成的语句应该是:
SELECT (CASE WHEN freq = 0 THEN 'pass' ELSE 'fail' END) FROM ( SELECT COUNT(*) freq FROM Grant_Award WHERE Grant_Award.org_ticker IS NULL );"
我认为语句末尾的 x 是导致错误的原因,想知道这是否误入了您的其他行。
我今天早上醒来,意识到这一定与磁盘上文件的字符集有关。以下是一个解决方案[无需更改查询]:
ActiveRecord::Base.connection.select_all(sql0.join(" ").encode("UTF-8"))
我提交的时候强制字符集为utf-8,现在一切正常。
证明:
#<ActiveRecord::Result:0x3bede68
@column_types={},
@columns=[""],
@hash_rows=nil,
@rows=[["pass"]]>
#<ActiveRecord::Result:0x3bf2c68
@column_types={},
@columns=[""],
@hash_rows=nil,
@rows=[["pass"]]>
"SELECT (CASE WHEN freq = 0 THEN 'pass' ELSE 'fail' END) FROM ( SELECT COUNT(*) freq FROM Grant_Award WHERE Grant_Award.org_ticker IS NULL )x;"
#<ActiveRecord::Result:0x3bf5410
@column_types={},
@columns=[""],
@hash_rows=nil,
@rows=[["pass"]]>