今天,我想解释一下如何将参数传递给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中查看结果。
我们完了!
你真聪明!我非常喜欢阅读您的博客。您能否分享一些有关从ERP / OLTP数据库清除/准备数据并将其有效地加载到事实表中的见解?
谢谢你的文章。它’s really nice
我的问题是您是否可以做相反的事情。创建一个存储过程,然后使用DAX创建一个Excel文件?
最好的
嗨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
任何想法或指导将不胜感激。
再次感谢!
大卫
很棒的帖子!
您写道:为了使生活更轻松,我将“检查日期”列的格式单元格更改为“文本”,否则我们需要在辽宁体育彩票 Query中对其进行转换
我想将代表日期的数字传递给sql查询。
在您的示例中,Excel中的“检查日期2009-01-01”为39814,我想将39814传递给我的sql查询。
您能否在辽宁体育彩票 Query中显示所需的转换
只是帮了我很多忙!谢谢!!!
感谢Soheil,
似乎当我们更改ProductID时,返回的不仅仅是参数。甚至在您的屏幕快照中,显示的产品还比您在参数中指定的ID为800的产品还要多。有什么想法吗?
嗨温斯顿,
欢迎使用BIInsight.com,并感谢您的反馈。
请注意,屏幕截图中显示的列不是 产品编号, 它是 ProductAssemblyID 这是完全不同的ID。
的 产品编号 尽管在过滤器中使用。
希望有帮助。
干杯。