Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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
在sp_executesql语句中显式替换参数的快速方法?_Sql_Parameters_Sp Executesql - Fatal编程技术网

在sp_executesql语句中显式替换参数的快速方法?

在sp_executesql语句中显式替换参数的快速方法?,sql,parameters,sp-executesql,Sql,Parameters,Sp Executesql,我正在用C编写一个程序,它使用传递给sp_executesql的参数运行一些select语句。我在测试时遇到的一个问题是,无论是从SQL Profiler还是从Visual Studio中的手表执行命令,参数的值都是在语句末尾指定的,而不是在查询中以行形式显式指定的。出于测试目的,我想用一种快速的方法来替换参数值 因此,不是: exec sp_executesql N' SELECT CustomerName FROM CustomerTable ct WITH(NOLOCK) WHERE ct

我正在用C编写一个程序,它使用传递给sp_executesql的参数运行一些select语句。我在测试时遇到的一个问题是,无论是从SQL Profiler还是从Visual Studio中的手表执行命令,参数的值都是在语句末尾指定的,而不是在查询中以行形式显式指定的。出于测试目的,我想用一种快速的方法来替换参数值

因此,不是:

exec sp_executesql N'
SELECT CustomerName
FROM CustomerTable ct WITH(NOLOCK)
WHERE ct.CustomerId <> @CustomerId
AND ct.ItemId <> @ItemId
AND ct.TransactionId = @TransactionId'
,N'@CustomerId bigint,@ItemId nvarchar(1),@TransactionId nvarchar(30), @CustomerId = 3000, @ItemId = N'4', @TransactionId=N'43281'
我想:

exec sp_executesql N'
SELECT CustomerName
FROM CustomerTable ct WITH(NOLOCK)
WHERE ct.CustomerId = 3000
AND ct.ItemId <> N'4'
AND ct.TransactionId = N'43281''

请不要太注意示例的语法,因为它只是用于演示概念。有人知道一种快速的方法吗?基本上,我希望将其替换为测试目的,因为这将使我更容易修改条件以测试它们如何影响返回的结果。我将感谢任何人能给予的帮助。谢谢。

参数化sp_executesql有很多好处,包括

通过显式参数化,SQL有机会在特定类型上缓存适当的查询计划 通过参数化,它有助于防止像SQL注入攻击这样的恶习,但也避免了转义有问题字符的需要。 因此,即使您设法“取消参数化”生成的sp_executesql,如果您执行内联sql,查询计划可能与参数化版本有很大不同,您还需要执行转义等操作,即它不适合Apple vs Apple测试

我能想到的唯一原因是,为什么您不希望使用参数化的sp_executesql是为了易于阅读

编辑:尝试替换取决于您使用的技术

正如@mellamokb所建议的,如果您使用的是ExecuteReader,这可能非常简单

假设你的代码是

string sqlCmd = "SELECT CustomerName 
FROM CustomerTable ct WITH(NOLOCK) 
WHERE ct.CustomerId <> @CustomerId 
AND ct.ItemId <> @ItemId 
AND ct.TransactionId = @TransactionId";

cmd.CommandText = sqlCmd;
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("CustomerId", DbType.Int32, myCustomerId));
cmd.Parameters.Add(new SqlParameter("ItemId", DbType.String, myItemId));
..
cmd.ExecuteReader()
然而,像Linq2SQL或EF这样的ORM就不那么容易了

customerTable.Where(c => (c.CustomerId != myCustomerId) && (c.ItemId != myItemId) && (c.TransactionId == myTransactionId))

可能像LinqPad这样的工具会有所帮助?

您可以手动浏览参数列表并将其值粘贴到查询中。否则,参数是在SQL引擎级别处理的优化,无法获取SQL用于处理的内部查询。您能提供用于生成动态sql命令的C代码吗?谢谢您的回复。是的,当我研究这个问题时,我读了一些关于使用sp_executesql执行SQL命令如何在运行大量查询时提高某些效率的内容。在内部,我希望代码保持不变。但是,如果只是为了测试,我希望能够使用已经替换的参数生成SQL命令。我可以暂时使用另一个SQL命令吗?例如,使用sp_executesql,然后可能使用另一段代码,这将导致输出一个更易于阅读的表达式,我可以稍后注释掉它?
customerTable.Where(c => (c.CustomerId != myCustomerId) && (c.ItemId != myItemId) && (c.TransactionId == myTransactionId))