我可以在Visual Studio中使用参数执行SQL吗?

时间:2017-12-06 11:25:27

标签: sql-server visual-studio

编辑:从评论来看,我一直不清楚我想要实现的目标。我会从另一个角度尝试。

我一直在开发sprocs多年。我越来越觉得在嵌入C#代码的SQL和sprocs之间进行选择都是不好的选择。我知道很多人会不同意,这很好。 我在这个问题上没有详细说明这一点,以避免讨论是关于sprocs的:-)。

作为一项实验,我尝试在Visual Studio中的项目中嵌入.sql个文件。从字面上看,在我的项目树中,我的文件扩展名为.sqlBuild Action设置为Embedded Resource

这样我就可以在VS中编辑SQL查询代码,甚至可以在VS中运行/执行它,而无需运行项目。我喜欢那个。我现在正在处理的实际代码类似于"产品列表"具有分页和多个排序和过滤选项。 SQL查询具有@skip@search等参数。这意味着如果我尝试从VS中运行/执行它(特别是通过按CTRL + SHIFT + e或选择"执行& #34;来自VS中的" SQL"菜单)这些参数缺失(当然),因为它们应在运行时以SqlParameter形式提供。我理解为什么这种情况发生,并且绝不意味着暗示VS或SSMS被窃听。我只是想找个方法来告诉" VS那个"当我从VS中执行此查询时,我打算让@skip成为10"。我(可能是错误的)认为VS具有IntelliSense支持和对.sql文件的执行支持的原因是支持类似于我正在尝试的场景。

我只是希望其他人也这样做,并有一个聪明的方式/插件/技巧来支持它。

编辑结束

在Visual Studio 2017的一个项目中,我有许多.sql文件,这些文件在构建时嵌入到应用程序中。
在VS中编辑文件时,我可以方便地连接到SQL服务器并执行查询 但是,如果查询具有如下参数:

SELECT * FROM Employee WHERE ID=@ID;

在Visual Studio中执行失败并带有

Must declare the scalar variable "@ID".

这可以修复"通过在脚本/文件的顶部添加一行,所以它看起来像:

DECLARE @ID int = 123;
SELECT * FROM Employee WHERE ID=@ID;

然而,现在从这样的代码中调用时它不起作用(使用Dapper,它与问题无关,但解释了语法):

var emp = conn.Query<Employee>( sql, new { ID=123 } );

我希望我可以在文件中的某个地方指定ID的值,或者指定VS将执行的文件的某些部分,但是稍后在从代码调用时会被忽略。

编辑:为了清楚起见,我可以制作SQL,以便在运行时从Visual Studio 中完美运行,但我不能同时使用它们。我希望有一些整洁的黑客,一个VS插件或只是一些我刚刚失踪的VS功能。我考虑添加一个简单的预处理器,所以我可以这样做:

--if DEBUG
DECLARE @ID int = 123;
--endif
SELECT * FROM Employee WHERE ID=@ID;

然后我可以将它添加到我加载嵌入资源的函数中。

1 个答案:

答案 0 :(得分:1)

如果我错误地理解了这个问题,请原谅。难道你正在寻找这样的东西吗?查询方法实际上并不重要,当你真正需要将替换添加到脚本本身时,看起来问题就是你将它声明为@ID

con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = "SELECT * FROM Employee WHERE ID=@ID;";
cmd.Parameters.Add("@ID", actualID); <--this is is why declaring doesn't work - You can declare it, but you also need to add it to the query
SqlDataReader rdr = cmd.ExecuteReader();