Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 我可以在Visual Studio中使用参数执行SQL吗?_Sql Server_Visual Studio - Fatal编程技术网

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

Sql server 我可以在Visual Studio中使用参数执行SQL吗?,sql-server,visual-studio,Sql Server,Visual Studio,编辑:从评论来看,我不清楚自己想要达到什么目标。我会从另一个角度试试 多年来,我一直在开发存储过程。我越来越觉得,在嵌入C代码的SQL和存储过程之间做出选择都是错误的选择。我知道很多人会不同意,这很好。 我没有在问题中详细说明这一点,以避免讨论是否涉及到存储过程:- 作为一个实验,我尝试在VisualStudio的项目中嵌入.sql文件。实际上,在我的项目树中,我有扩展名为.sql的文件,构建操作设置为Embedded Resource 这样我就可以在VS中编辑SQL查询代码,甚至可以在VS中运

编辑:从评论来看,我不清楚自己想要达到什么目标。我会从另一个角度试试

多年来,我一直在开发存储过程。我越来越觉得,在嵌入C代码的SQL和存储过程之间做出选择都是错误的选择。我知道很多人会不同意,这很好。 我没有在问题中详细说明这一点,以避免讨论是否涉及到存储过程:-

作为一个实验,我尝试在VisualStudio的项目中嵌入.sql文件。实际上,在我的项目树中,我有扩展名为.sql的文件,构建操作设置为Embedded Resource

这样我就可以在VS中编辑SQL查询代码,甚至可以在VS中运行/执行它,而无需运行项目。我喜欢。我现在正在处理的实际代码类似于一个产品列表,其中包含分页、多个排序和过滤选项。SQL查询有@skip、@search等参数。这意味着,如果我尝试在VS中运行/执行它,特别是按CTRL+SHIFT+e或从VS中的SQL菜单中选择execute,这些参数当然会丢失,因为它们在运行时将作为SqlParameter提供。我理解为什么会发生这种情况,绝不意味着VS或SSMS被窃听。我只是想告诉VS,当我在VS中执行这个查询时,我打算将@skip设置为10。我可能错误地认为VS对.sql文件提供IntelliSense支持和执行支持的原因是为了支持类似于我正在尝试的场景

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

编辑结束

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

SELECT * FROM Employee WHERE ID=@ID;
--if DEBUG
DECLARE @ID int = 123;
--endif
SELECT * FROM Employee WHERE ID=@ID;
从VisualStudio中执行失败,原因是

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

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();

您不能将SQL作为存储过程存储在服务器上吗?我可以,但宁愿避免。我们还没有找到一个令人满意的DB版本控制解决方案,所以我宁愿不在DB中存储代码。此外,这将如何帮助我在VS中编辑和执行它?可能是@AlexK的副本。存储过程是一个无关的讨论;有时有效,有时无效-但简单地说:不相关:请参阅:第二部分然而,现在当从代码中这样调用时它不起作用-会发生什么?sql是您期望的值吗?只要sql是您问题中的字符串,您所显示的内容就可以正常工作。整洁不在乎绳子从哪里来。它只关心字符串包含的内容-那么:sql的值是多少?注意:这里的所有内容都已经是问题中显示的代码所能完成的。因此,虽然这个答案中的代码没有问题,但它也没有改变问题中的任何内容。我的观点是,您示例中的SQL不能从VS或SSMS中执行,它会抱怨@ID未声明。在我的实际代码中,CommandText可能有50行长,并且驻留在扩展名为.sql的文件中。我可以通过Sql->execute菜单在VS中轻松地对Sql Server执行此文件,但前提是没有未声明的参数。