sqlserver 设置中文_Power BI数据回写SQL Server(1)没有中间商赚差价

c85b4b2f1b04db17b5396112c670f1f8.png

我们在【重磅来袭】在Power BI 中使用Python(4)——PQ数据导出&写回SQL 讲过如何在Power BI中调用Python实现powerquery获取和处理的数据回写到MySQL中。

有不少朋友提问,能否回写到SQL SERVER中呢?

fc9bc69f35fd6ecf3c0ab2f2bfd18b4e.png

答案是肯定的。有两个大的解决方案:

第一个,由于本质上我们调用的是Python脚本,所以回写入哪个数据库由Python来决定。写入MySQL的库是pymysql,而如果要写入SQL SERVER我们需要更换一个库:

pip install pymssql

从名字上我们也能看出,这两个库的作者是同一个人,因此用法几乎完全一致。只不过在对待表名是中文时处理方式不太一样,MySQL需要在表名上加“`表名`”符号,SQL SERVER则不需要。

点击:转换-运行Python脚本,编辑代码,运行。

7bf9209bc0b0bb1f8896030fe35d94a4.gif

可以看到在运行Python脚本前,SQL数据库共378条数据,运行后是578条,增加了200条,这说明前几天只有189个国家和地区的数据,而今天更新有200个国家和地区的数据,这也直接说明病毒还在继续向更多国家蔓延,防控形势不容乐观。

获取完整源代码,请关注本公众号【学谦数据运营】,回复关键字“powerbi-python-sqlserver”

e1e0d2afd3af0df6c7acf549f4e9924d.png

第二个办法,其实更简单一些,而且直接跳过了Python,因为Power BI和SQL Server都是微软家的拳头产品,自家人,肯定办事方便些。

我们先从SQL Server导入一张表到powerquery中:

467d359c481331fccfd90d17bb7d6190.gif

点开高级编辑器:

let        源 = Sql.Database("DESKTOP-NLIOB2L\MSSQLSERVER1", "test1"),        dbo_Sheet1 = 源{[Schema="dbo",Item="Sheet1"]}[Data]in    dbo_Sheet1

将以上代码适当进行修改:

let        源 = Sql.Database("DESKTOP-NLIOB2L\MSSQLSERVER1", "test1",[Query="select * from Sheet1"])in    源

点运行:

8356655ebee3fe4639db59c8fb8486fa.png

两种查询方式得到的结果完全一致。

但是修改后的代码意义却变了:

[Query="select * from Sheet1"]

这实现了在PowerQuery中直接输入SQL Server代码并运行:

acc0e5894607e90412c308f05a70b31f.png

这就代表着我们可以通过编写SQL语句向SQL Server插入数据了:

let        Source = Excel.CurrentWorkbook(){[Name="表1"]}[Content],        ChangedType = Table.TransformColumnTypes(Source,{{"KeyValue", type text}, {"NumberValue", Int64.Type}, {"DateValue", type date}}),        insert=Sql.Database("DESKTOP-NLIOB2L\MSSQLSERVER1", "test1",[Query="INSERT INTO Sheet1(KeyValue,NumberValue,DateValue)VALUES('A',3,'2019/1/1')"])in    insert

看一下运行过程:

1a470017d4ff71dc29316a8691319c3e.gif

可以看到原表中只有2017年的数据,运行后增加了5行2019/1/1的数据,查询一次却增加多行的原因我们在【重磅来袭】在Power BI 中使用Python(4)——PQ数据导出&写回SQL中也说过,尚未明确知晓什么原理,只能通过其他办法来处理,稍后再说。

当然我们也可以同时插入多行数据:

15b3fa9b2eb90fbb407bfc748ecb9b2f.png

结果:

bce2c31e996846bcd20313663f30cda2.png

但是这样我们只能实现自己手动填写数据写入SQL语句去运行,而无法将PQ查询的结果写入SQL。

所以还得想别的办法。

我们再来试试Value.NativeQuery方法,是将一条record记录数据直接插入数据库中:

    Value.NativeQuery            (            Sql.Database("DESKTOP-NLIOB2L\MSSQLSERVER1", "test1"),                        "INSERT INTO Sheet1 VALUES(@KeyValue,@NumberValue,@DateValue)",                        [KeyValue="NativeQuery",NumberValue=3,DateValue="2019/1/1"]                    )

运行结果:

7bd87f1ab9e107521ab7909a58ed8a48.png

测试没有问题。

那么重要的就来了:

如果我们能够将PQ返回的表按行转换为一条条的record记录,再逐条导入SQL Server,那么我们的需求就得到了解决。

第一步:使用Table.ToRecords函数将table转为record list:

dc72cb54821a75fa895a320c7460ca93.gif

第二步:我们再做一个循环,逐行读取这些records,并用Value.NativeQuery函数套在这些records上:

insert=  List.Transform(records,(x)=>    Value.NativeQuery            (                        Sql.Database("DESKTOP-NLIOB2L\MSSQLSERVER1", "test1"),                        "INSERT INTO Sheet1 VALUES(@KeyValue,@NumberValue,@DateValue)",                        x                    )  )

就得到结果了:

17525eb7400a5a4af2d4f7d158da6119.gif

还是那句感叹:

2d647a604adee80bacf1c776d525b1bb.png

只不过,日期格式跟之前的并不太一致:

7f28fe26088839f6c31ea1361953b975.png

好在这并不是什么大问题,在SQL中设置一下datevalue字段的格式为date就可以搞定:

565cd28ab378dcd93ed5b275fd249eeb.png

58a27c23052a803fae2007a2194688fe.gif

至于刷新时重复导入或者每日刷新多次的问题,大家结合上一篇文章自己就可以解决,无非就是用DELETE函数,这里就不再赘述了。

说到这里,我们再回过头来探讨一下Power BI和MySQL有没有可能也跳过Python这个“中间商”直接交易呢?

看图:

e23f8534a0a05637cd69cec1145d46a4.png

你说呢?

2f645638052311fa73931f97ecc148d8.png


以下,后续文章预告:

今天我们讲的是PQ生成record列表,再逐个导入SQL中,那有没有办法将PQ中的table作为一个整体导入SQL中呢?

PowerQuery还为我们提供了其他方式,比如调用存储过程。

由于存储过程是SQL语言中很重要的一个内容,我们将用一整篇文章来详细说明,敬请期待。

9361012cbf40977df1e4f9687e93d4d0.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值