Получение # 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, так что это честная игра, чтобы изменить его в некоторых способ, который сделает это возможным