Ruby с MS SQL, чтобы обрезать всю таблицу в БД - PullRequest
0 голосов
/ 30 октября 2019

Я использую ruby ​​и tiny_tds (ms sql). Я хочу обрезать все таблицы в базе данных.

ниже - вот что у меня сейчас:

require 'tiny_tds'
@client = TinyTds::Client.new(username: 'sa', database: 'test123', password: 'Auto1', host: 'localhost', port: 1433)
puts 'Connecting to SQL Server'

if @client.active? == true then puts 'Done' end

out = @client.execute("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_CATALOG='test123'");
#@client.do
#puts "out ==> #{out}"
out.each do |x|
        puts "tabname1 ==> #{x['TABLE_NAME']}"
        next if x['TABLE_NAME'] =~ /api_user|version_info/
        @client.execute("TRUNCATE TABLE #{x['TABLE_NAME']}")
        @client.do
end
@client.close

Вывод:

$ ruby mssql.rb
Connecting to SQL Server
Done
tabname1 ==> test
mssql.rb:14:in `execute': Attempt to initiate a new Adaptive Server operation with results pending (TinyTds::Error)
    from mssql.rb:14:in `block in <main>'
    from mssql.rb:10:in `each'
    from mssql.rb:10:in `<main>'

Я знаю, что нам нужно использоватьdo [@client.execute(sql).do]. но все равно получаю ошибку

Обновление:

таблиц в test123 дБ

test, test1

1 Ответ

0 голосов
/ 30 октября 2019

Я считаю, что проблема в том, что вы пытаетесь запустить новое выполнение внутри своего блока out.each, хотя первоначальное выполнение out = @client.execute(...) еще не завершено.

Здесь вы выполняете некоторые sql:

out = @client.execute("SELECT TABLE_NAME FROM INFORMATION_SCHEMA....

... и затем внутри вашего цикла each вы пытаетесь выполнить снова:

@client.execute("TRUNCATE TABLE #{x['TABLE_NAME']}")

... до того, как началось выполнение out. завершено с использованием out.do, как вы предложили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...