Как я могу вставить результат одного запроса в другую базу данных с помощью powershell

#mysql #sql #powershell

#mysql #sql #powershell

Вопрос:

Моя проблема в том, что мне нужно использовать сценарий powershell для подключения к базе данных и запроса некоторых результатов и немедленно подключиться к другой базе данных и вставить в другую базу данных. Мой пример кода выглядит следующим образом, и, похоже, он не работает

 $rs1 = SQLCMD -W -h-1 -S $server1 -d $database1 -Q "SET NOCOUNT ON; select ErrorLogId, CreatedDtim from dbo.ErrorLog where  order by CreatedDTim DESC;"
SQLCMD -W -h-1 -S $server2 -d $database2 -Q "Insert into dbo.ErrorLog $rs1"
  

Спасибо!

Ответ №1:

Я признаю, что у меня нулевой опыт взаимодействия PowerShell с SQL, так что в основном это просто обоснованное предположение, но имеет ли смысл, что $ rs1 имеет некоторый тип DataTable, который не отображается как параметр T-SQL и не печатается в синтаксисе T-SQL?

Если бы я делал что-то подобное на C #, как я обычно делаю, мне пришлось бы разобрать $ rs1 и перебирать каждую строку. Другими словами, мне нужно что-то похожее на следующий псевдо-псевдокод:

 var datatable = getTable("select ErrorLogId, CreatedDtim from dbo.ErrorLog where  order by CreatedDTim DESC");
bool first = true;
StringBuilder builder = new StringBuilder("INSERT INTO dbo.ErrorLog VALUES ");
foreach(var row in datatable.Rows)
{
    if(first)
        first = false;
    else
        builder.append(", ");

    builder.append("("   row["ErrorLogId"]   ", "   row["CreatedDtim"]   ")");
}

executeNonQuery(builder.ToString());
  

Очевидно, что многое из этого является плохой практикой, и это не очень чисто, но вы поняли суть. Просто вставляя параметр datatable, вы полагаетесь на toString DataTable, волшебным образом превращая его в код T-SQL.

Другой вариант здесь, если вы хотите выполнять межсерверные запросы, я полагаю, что это поддерживается некоторыми версиями SQL Server.