我想让用户直接从excel上传行到sql中,令人惊讶的是,它正在工作,我设置了一个输入表,然后第二个表将读取第一个表,对于每一行,它将使用每一列作为参数来执行sp。我遇到的问题是:
了解sp是否正常运行,并告知用户是否正常
不需要powerquery第二次运行sp就可以得到#1(我们都知道他喜欢多次运行stuff,因为它是一种懒惰的方法/自下而上的方法)
所以,考虑到有一个sql表,一个sql存储过程和一个excel文件,我发现很难显示到目前为止我所拥有的,但是这里是它
一切都从sheet1上的一个小table1开始,它有两列将被上传到sql中
sql中没有问题,但是为了提供一个可复制的示例,可以做以下操作:
CREATE TABLE dbo.Table1 (A int, B int)
找张table
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"
这将抓住表1,并为每一行运行 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"
我希望我没有被这么长的解释弄糊涂,我的最终目标是使用sp将excel表的每一行上传到sql中(为了安全和规则验证),它不必使用powerquery的这个函数,甚至不必使用powerquery,只要它是简单的,并且有基本excel知识的人和sql都不能运行它(目前所有需要运行的都是刷新)查询和我正在使用一个宏这样做,以使用户的生活更轻松)但如果他键入文本而不是数字,它将给出一个错误,用户将永远不会知道它(当然,仅仅检查文本是不够的,因为实际的sp要复杂得多,而且有很多东西会产生错误)而且,我是创建sp的人,所以以某种方式改变它是公平的游戏,这将使这成为可能
暂无答案!
目前还没有任何答案,快来回答吧!