Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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
为什么LINQ发送sp_executesql而不是直接执行SQL?_Sql_Linq To Sql - Fatal编程技术网

为什么LINQ发送sp_executesql而不是直接执行SQL?

为什么LINQ发送sp_executesql而不是直接执行SQL?,sql,linq-to-sql,Sql,Linq To Sql,对于eaxmple,LINQ to SQL将发送以下内容: exec sp_executesql N'SELECT [t0].[HomeID], [t0].[Bedrooms], [t0].[ImageURL], [t0].[Price], [t0].[Available], [t0].[Description] FROM [dbo].[Homes] AS [t0] WHERE ([t0].[Description] LIKE @p0) AND

对于eaxmple,LINQ to SQL将发送以下内容:

exec sp_executesql 
N'SELECT [t0].[HomeID], 
  [t0].[Bedrooms], 
  [t0].[ImageURL], 
  [t0].[Price], 
  [t0].[Available], 
  [t0].[Description]
FROM 
  [dbo].[Homes] AS [t0]
WHERE 
  ([t0].[Description] LIKE @p0) AND 
    ([t0].[Available] = @p1) AND 
    ([t0].[Price] >= @p2) AND ([t0].[Price] <= @p3)
ORDER BY 
  [t0].[Price] DESC',
N'@p0 nvarchar(4000),@p1 int,@p2 int,@p3 int',
@p0=N'%private%',
@p1=1,
@p2=200000,
@p3=750000
exec sp_executesql
N'选择[t0].[HomeID],
[t0][卧室],
[t0]。[ImageURL],
[t0]【价格】,
[t0].[Available],
[t0]。[说明]
从…起
[dbo].[Homes]作为[t0]
哪里
([t0].[Description]类似@p0)和
([t0].[Available]=@p1)和

([t0].[Price]>=@p2)和([t0].[Price]编辑,哎呀,我说的是参数化而不是参数替换,谢谢Steffu


sp_executesql比executesql更受欢迎,因为它支持参数替换,而且执行效率更高。

此表示法允许运行时编译的TSQL语句与不同的参数一起重新使用;即该语句只编译一次,这提高了效率。

这至少是部分原因,因此您可以et查询计划重用。它可以将参数内联,这意味着每次使用不同的参数运行查询时,分析器都会将其视为不同的查询并重新解析。但由于它是以这种方式执行的,因此查询计划会被缓存,每次运行时它都可以插入新的变量。

需要注意的一点是,它是一个由于参数化,lso提供了保护。不能抱怨这一点…

这是一个很好的问题。
这不是真正的答案,而是对其他答案已经给出的推理的探索。请随时更新此“答案”

显然,答案应该是“
参数化查询缓存”
”。然而,当直接执行语句并且仍然缓存时,参数也可以很容易地绑定

这篇MSDN文章中的语法和详细信息

性能声明我怀疑没有数据,因为直接查询和sp_execsql查询的缓存似乎是相同的


因此,如果不是这些,那是什么?

我不认为这是一个性能解决方案。SQL中的执行计划即使用于直接查询也会被缓存

我确实认为它是sql注入的安全解决方案


但是,如果您试图在数据库引擎优化顾问中使用使用Linq to SQL的跟踪,则优化顾问不会解释sp_执行,我希望将其关闭。在Linq to SQL语句/框架(代码)中也可以检测到SQL注入为什么还要尝试将无效数据发送到SQL。

Execute也是可以参数化的,所以参数化不是它。什么数据说它执行得“更有效”这至少是相同的成本。从技术上讲,说参数替换而不是参数化可能更为正确,至于效率,我邀请您查看以下链接。作为有关Execute支持相同参数化语句缓存策略的附加信息。本文讨论的是Execute tsqlOP想知道为什么要发送sp_executesql而不是直接发送“内部”语句(参数和全部)。是的,我想我也应该对我的语句进行更好的限定:)通过OLEDB/ODBC发送SQLExecuteSQL就像一个可参数化的语句一样。除非发送的语句不止一条,否则这似乎没有意义。Execute对参数化查询使用相同的语句缓存。此外,这样可以更安全地防止SQL注入。不根据此链接:-“运行时编译的Transact-SQL语句会使应用程序遭受恶意攻击,例如SQL注入。”这不是使用sp_executesql tho的原因。通过OLE/DB和ODBC,SqlExecDirect调用上也可以使用参数化。@Adamski-当然可以…”LINQ to SQL通过在查询中使用SqlParameter避免这种注入。“OP您应该稍微澄清一下您的意思-我认为您正在通过SQL Profiler观看,并看到调用正在进行。我将您的问题解释为“为什么L2S使用sp_executesql而不是直接发送包含的语句?”。