2015-03-25 54 views
0

鑑於以下紅寶石:TinyTds ::錯誤:過程預計參數

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返回就好前兩個嘗試。第三個從文件讀入數組然後加入炸彈。我知道這一定與絃樂的處理有關。但我無法弄清楚這一點。

我在做什麼錯?爲什麼它(tinytds或activerecord?)認爲這是一個存儲過程?

我想要做的是在一個文件夾中有一大堆sql腳本,然後逐個執行它們。

詳細信息:紅寶石1.9.3,ActiveRecord的(4.2.0),和tiny_tds(0.6.2 86的mingw32)

+0

什麼做的語句結尾的X?這對我來說是錯誤的。 – ReggieB 2015-03-25 08:46:55

回答

1

我今天早上醒來,意識到它必須與磁盤上文件的字符集有關。下面是一個解決方案的工作[不改變查詢]:

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"]]> 
0

我想通過文件導入生成的語句應該是:

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會導致錯誤,並懷疑它是否誤入其他行。

+0

TSql需要子查詢的標籤。 Sql Server將在沒有標籤的情況下拋出一個錯誤。我使用小寫字母「x」來使其在視覺上低調,並且不會從代碼的其餘部分分散注意力,因爲在該查詢中標籤在功能上是無用的。 – donvnielsen 2015-03-25 10:21:47

+0

啊!我通常會在子查詢和x之間放置一個AS。 – ReggieB 2015-03-25 10:44:39

+0

我在這裏和那裏學習一點點,因爲我之前沒有處理代碼頁。代碼中的字符串sql2或sql1以US-ASCII編碼。從文件sql0中讀取的字符串被編碼爲IBM437。我不確定IBM437是否典型,但這是我的筆記本電腦配置的方式。當我將代碼頁強制爲UTF-8時,所有這一切都對世界都很好。 – donvnielsen 2015-03-25 11:59:16

相關問題