我刚刚问了一个与 SQL 相关的问题,第一个答案是:“这是动态 SQL 是要走的路的情况。”
由于我以前从未听说过动态 SQL,我立即在这个网站和网络上搜索了它是什么。没有这个标题的文章。第一个谷歌结果都指向用户论坛,人们在那里提出更多或更少的相关问题。
但是,我没有找到一个“动态 SQL”是什么的明确定义。它是供应商特定的东西吗?我使用MySQL,我没有在 MySQL 手册中找到参考(只有问题,大多是未回答的,在 MySQL 用户论坛中)。
另一方面,我发现了许多对存储过程的引用。我对什么是存储过程有了更好的掌握,尽管我从未使用过任何。这两个概念是如何相关的?它们是同一件事还是一个使用另一个?
基本上,需要的是一个简单的介绍动态 SQL的人谁是新的概念。
附言:如果你喜欢,你可以尝试回答我之前提出的问题:SQL: How can we make a table1 JOIN table2 ON a table given in a field in table1?
动态 SQL仅仅是在动态构建查询的地方-对于某些供应商,您可以在一个存储过程中构建动态查询的文本,然后执行生成的 SQL。在其他情况下,该术语仅指由客户端上的代码做出的决定(这至少是供应商中立的)
其他答案已经定义了什么是动态 SQL,但是我没有看到任何其他试图描述为什么我们有时需要使用它的答案。(我的经验是 SQL Server,但我认为其他产品在这方面通常是相似的。)
当您要替换无法使用其他方法替换的查询部分时,动态 SQL 非常有用。
例如,每次你调用一个查询,如:
SELECT OrderID, OrderDate, TotalPrice FROM Orders WHERE CustomerID = ??
您将为 CustomerID 传递不同的值。这是最简单的情况,可以使用参数化查询或接受参数的存储过程等解决。
一般而言,出于性能和安全原因,应避免使用动态 SQL,而支持参数化查询。(尽管供应商之间,甚至产品版本之间,甚至服务器配置之间的性能差异可能很大)。
其他查询可能使用参数,但可能更简单作为动态 SQL:
SELECT OrderID, OrderDate, TotalPrice FROM Orders
WHERE CustomerID IN (??,??,??)
如果你总是有 3 个值,这和第一个一样容易。但是如果这是一个可变长度的列表呢?它可能与参数有关,但可能非常困难。怎么样:
SELECT OrderID, OrderDate, TotalPrice FROM Orders WHERE CustomerID = ??
ORDER BY ??
这不能直接替换,您可以在 ORDER BY 中使用一个巨大的复杂 CASE 语句来明确列出所有可能的字段,这可能是实际的,也可能是不实际的,具体取决于可用于排序的字段的数量。
最后,有些查询根本无法使用任何其他方法完成。
假设你有一堆订单表(不是说这是伟大的设计),但你可能会发现自己希望你可以做这样的事情:
SELECT OrderID, OrderDate, TotalPrice FROM ?? WHERE CustomerID = ??
在我的环境中,我经常遇到这样的查询:
SELECT (programatically built list of fields)
FROM table1 INNER JOIN table2
(Optional INNER JOIN to table3)
WHERE (condition1)
AND (long list of other optional WHERE clauses)
再说一次,并不是说这一定是伟大的设计,但是这些类型的查询几乎需要动态 SQL。
希望这有帮助。
动态 SQL 只是一个 SQL 语句,在执行之前即时组成。例如,下面的 C#(使用参数化查询):
var command = new SqlCommand("select * from myTable where id = @someId");
command.Parameters.Add(new SqlParameter("@someId", idValue));
可以使用动态 sql 重写为:
var command = new SqlCommand("select * from myTable where id = " + idValue);
不过,请记住,动态 SQL 是危险的,因为它很容易允许 SQL 注入攻击。
动态 SQL 是在运行时从字符串构建的 SQL。动态设置过滤器或其他东西很有用。
一个例子:
declare @sql_clause varchar(1000)
declare @sql varchar(5000)
set @sql_clause = ' and '
set @sql = ' insert into #tmp
select
*
from Table
where propA = 1 '
if @param1 <> ''
begin
set @sql = @sql + @sql_clause + ' prop1 in (' + @param1 + ')'
end
if @param2 <> ''
begin
set @sql = @sql + @sql_clause + ' prop2 in (' + @param2 + ')'
end
exec(@sql)
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(3条)