Запуск хранимых процедур из Excel с использованием PowerQuery - PullRequest
0 голосов
/ 05 августа 2020

Я хочу, чтобы пользователь загружал строки в SQL непосредственно из excel, и, что удивительно, он работает, я установил таблицу ввода, а затем вторую таблицу, которая будет читать первую, и для каждой строки будет выполнять SP, используя каждый столбец в качестве параметра. У меня проблемы с:

  1. Знать, работает ли SP без проблем, и сообщать пользователю, если да
  2. Получение # 1 без повторного запуска PowerQuery SP (и все мы знаем, что он любит запускать что-то несколько раз из-за его ленивого метода / подхода снизу вверх. excel файл. Мне было довольно сложно показать, что у меня есть до сих пор, но вот оно

    Все начинается с небольшой таблицы1 на листе 1, имеющей 2 столбца, которые будут загружены в SQL Таблица 1

    В SQL проблем нет, но для воспроизводимого примера можно сделать следующее:

    CREATE TABLE dbo.Table1 (A int, B int)
    

    , чтобы получить таблицу

    CREATE PROCEDURE [dbo].[spAddToTable] @A int, @B int
    AS
    BEGIN
        INSERT INTO dbo.Table1 (A, B) VALUES (@A, @B)
    END
    GO
    

    , чтобы получить SP, который будет заполнять таблицу

    Затем у меня есть следующий код в PowerQuery:

    let
        Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"A", Int64.Type}, {"B", Int64.Type}}),
        #"Added Custom" = Table.AddColumn(#"Changed Type", "exec", each
            Value.NativeQuery(Sql.Database("«MyServer»", "«MyDataBase»"), "EXEC [dbo].[spAddToTable] @A, @B, [#"@A" = [A], #"@B" = [B]])))
    in
        #"Added Custom"
    

    Это будет захватывать Table1 и для каждой строки запускать EXEC [dbo].[spAddToTable] для параметров A и B. Это вернет для каждой строки таблицу с одним столбцом. Записи, затронутые как 1

    Это здорово, я могу не только загружать строки в SQL, но также могу знать, что строка был изменен, и, таким образом, SP запускался успешно (у меня была бы ошибка вместо таблицы, если бы это не было) Проблема теперь в том, что если я загружу таблицу в excel, у меня, естественно, будет просто строка [table] вместо реальной таблицы. Это легко исправить, мне просто нужно развернуть таблицу перед ее загрузкой в ​​Excel, но при этом SP будет запущен второй раз (это означает, что для каждой строки, которую я пытаюсь загрузить, я загружаю 2 строки)

    let
        Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"A", Int64.Type}, {"B", Int64.Type}}),
        #"Added Custom" = Table.AddColumn(#"Changed Type", "exec", each Value.NativeQuery(Sql.Database("«MyServer»", "«MyDataBase»"), "EXEC [dbo].[spAddToTable] @A, @B, [#"@A" = [A], #"@B" = [B]]))),
        #"Expanded exec" = Table.ExpandTableColumn(#"Added Custom", "exec", {"Records Affected"}, {"Records Affected"})
    in
        #"Expanded exec"
    

    Надеюсь, меня не сбило с толку такое длинное объяснение. Моя конечная цель - загрузить каждую строку таблицы excel в SQL с помощью SP (как для безопасности, так и для проверки правил), которого нет » Это должно быть сделано с этой функцией PowerQuery или даже с PowerQuery вообще, если она защищена от дурака и кто-то с базовым c знанием Excel и ни один из SQL не может ее запустить (в настоящее время все, что нужно запустить, обновляет запрос, и я использую макрос для этого, чтобы сделать жизнь пользователя еще проще), но если он наберет текст вместо числа, он выдаст ошибку, и пользователь никогда не узнает об этом. (естественно, просто проверки текста недостаточно, поскольку фактический SP намного сложнее, и есть еще много вещей, которые могут дать ошибку) Кроме того, я тот, кто создал SP, так что это честная игра, чтобы изменить его в некоторых способ, который сделает это возможным

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