功率查询和SQL Server存储过程

今天,我想解释一下如何将参数传递给SQL Server存储过程。我本人正在寻找一种将参数从辽宁体育彩票 Query传递到SQL Server存储过程的方法。我花了很多时间在互联网上搜索一篇不错的文章,该文章解释了如何将参数从辽宁体育彩票 Query传递到存储的proc并在Excel中显示结果。但是,正如我所料,我找不到太多有关此方面的信息。因此,我决定进行一些处理,您可以在本文中阅读结果。为了简化解决方案,我将在AdventureWorks 2012数据库中使用uspGetBillOfMaterials存储过程。该存储过程接受一个整数作为ProductID,接受一个日期作为CheckDate。因此,我们需要将两个参数传递给uspGetBillOfMaterials  to get the results.

如果我们使用以下命令在SSMS中执行存储的proc

执行 [dbo].[uspGetBillOfMaterials] 727, ‘2009-01-02’

,我们将得到以下结果:

图片

现在,让我们在辽宁体育彩票 Query上做一些工作。因此,打开Microsoft 电子表格并转到“电源查询”选项卡,然后选择“ SQL服务器数据库”。

图片

现在,键入服务器,数据库和SQL语句,然后单击确定。

图片

为查询选择一个名称,我将其命名为GetBOM。然后在首页标签中点击“关闭& Load”.

图片

到目前为止,我们已经将结果加载到Excel中。现在我们需要将参数传递给存储的proc。如您所见,上面存储的过程 接受整数和日期作为参数。因此,我们在Excel工作表中创建了一个包含两列包含参数的表格。将该表命名为“ 参数”。

图片

为了让生活更轻松,我将“检查日期”列的格式单元格更改为“文本”,否则,我们需要在辽宁体育彩票 Query中对其进行转换。我们仍然需要在辽宁体育彩票 Query中转换ProductID。

图片

现在回到辽宁体育彩票 Query,右键单击GetBOM,然后单击Edit。

图片

在“ GetBOM查询编辑器”窗口中,转到“视图”选项卡,然后单击“高级编辑器”。

图片

在这里,我们需要添加一些代码。 功率查询中的脚本以称为“ M”的语言编写。

我们所需要的只是参数化查询,以便我们从之前定义的“ 参数”表中读取内容。使用M语言,要读取单元格内容,我们需要处理以下表格:

电子表格.CurrentWorkbook(){[Name =”TABLE_NAME“]}[Content]{ROW_NUMBER} [#”COLUMN_NAME],

在上面的代码中,TABLE_NAME在我们的示例中是“ 参数”,ROW_NUMBER是我们需要加载其内容的行数,而COLUMN_NAME是列的名称。因此,要对“ 参数”表的第一列的值进行加法运算,以上代码将如下所示:

电子表格.CurrentWorkbook(){[Name =”参数“]}[Content]{0} [#“ 产品编号”],

第二个是这样的:

电子表格.CurrentWorkbook(){[Name =”参数“]}[Content]{0} [#“检查日期”],

现在,我们需要用上面的表达式替换查询中的常量,以使查询参数化。 您可以在“高级编辑器”中复制以下代码:


   ProductID = 电子表格.CurrentWorkbook(){[Name =”param”]}[Content]{0}[#”ProductID”],
   CheckDate = 电子表格.CurrentWorkbook(){[Name =”param”]}[Content]{0}[#”Check Date”],
    源= Sql.Database(“SQL_SERVER_INSTANCE NAME“, “AdventureWorks2012”,
    [Query=”exec [dbo]。[uspGetBillOfMaterials]‘”
    &Number.ToText(ProductID)
    & “‘, ‘”
    & CheckDate
    & “‘”])

    Source

您需要在上面的代码中放置您自己的SQL Server实例名称。

请注意代码中的单引号。

图片

要连接文本,我们使用“&”以M语言显示。单击完成,然后单击关闭并从主页选项卡加载。

现在,如果您更改“参数”表的值并刷新数据,您将在Excel中看到新结果。

例如,将ProductID从727更改为800,然后刷新数据。您会看到以下屏幕:

图片

如您所见,传递给存储过程的第一个参数已更改为800。单击“运行”以在Excel中查看结果。

图片

我们完了!

8 thoughts on “功率查询和SQL Server存储过程

  1. 你真聪明!我非常喜欢阅读您的博客。您能否分享一些有关从ERP / OLTP数据库清除/准备数据并将其有效地加载到事实表中的见解?

  2. 我的问题是您是否可以做相反的事情。创建一个存储过程,然后使用DAX创建一个Excel文件?

    最好的

  3. 嗨Soheil,
    感谢您发表如此深刻的文章。一世’我很喜欢您的博客,并且已经使用了很多帖子。

    I’我一直试图在本地数据库查询而不是存储过程中复制结果,但是我’我没有成功。

    基本上我希望能够做到:

    BeginDt = GetValue(rng_BeginDt),
    EndDt = GetValue(rng_EndDt),
    源= Sql.Database(“XXX”, “YYY”, [Query=”

    选择
    SalesID

    来自销售

    哪里
    SalesDt BETWEEN ‘BeginDt’ AND ‘&EndDt&’

    “]

    GetValue是我’定义为从范围名称中获取值。

    I’尝试了不同的变体,例如使用&’,也可以使用Excel.CurrentWorkbook方法在不使用函数的情况下调用日期的方法。

    我收到以下错误:
    DataSource.Error:Microsoft SQL:从字符串转换日期时间时转换失败。
    细节:
    从字符串转换日期时间时,Message = Conversion转换失败。
    数= 241
    类= 16

    任何想法或指导将不胜感激。
    再次感谢!
    大卫

  4. 很棒的帖子!
    您写道:为了使生活更轻松,我将“检查日期”列的格式单元格更改为“文本”,否则我们需要在辽宁体育彩票 Query中对其进行转换
    我想将代表日期的数字传递给sql查询。
    在您的示例中,Excel中的“检查日期2009-01-01”为39814,我想将39814传递给我的sql查询。
    您能否在辽宁体育彩票 Query中显示所需的转换

  5. 感谢Soheil,

    似乎当我们更改ProductID时,返回的不仅仅是参数。甚至在您的屏幕快照中,显示的产品还比您在参数中指定的ID为800的产品还要多。有什么想法吗?

有什么想法吗?在这里与我们分享:

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.