使用INNER JOIN ON LIKE关键字进行动态SQL查询

时间:2019-05-06 07:24:33

标签: sql sql-server

我正在尝试建立动态SQL查询。变量@NSQL包含带有关键字from itertools import islice, chain def window(seq, n=2): "Returns a sliding window (of width n) over data from the iterable" " s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ... " it = iter(seq) result = tuple(islice(it, n)) if len(result) == n: yield result for elem in it: result = result[1:] + (elem,) yield result l = [1, 2, 2, -5, -4, 3, 1, 1, 2, 0] s = {1,3,2} def minimum_subset(l, s): for w in chain.from_iterable(window(l, i) for i in range(len(s), len(l)+1)): if s == set(w): return w return [] print(minimum_subset(l, s)) 作为最后连接条件的SQL查询。

(3, 1, 1, 2)

这项工作还可以。

现在,我正尝试将其转换为动态SQL LIKE查询,如下所示:

<<INNERJOINKEYWORD>>

当我执行 SET @NSQL = 'SELECT * FROM CLIENT <<INNERJOINKEYWORD>>' SET @NSQL = REPLACE(@NSQL,'<<INNERJOINKEYWORD>>',' INNER JOIN #TempTable ON Client.Name = #TempTable.ClientName') 时,文本'#TempTable.ClientName'是查询的一部分,如何使其动态化?

1 个答案:

答案 0 :(得分:5)

SET @NSQL = REPLACE(@NSQL,'<<INNERJOINKEYWORD>>',' INNER JOIN #TempTable ON Client.Name LIKE ''%'' + #TempTable.ClientName + ''%''')

但是,请注意,您可能会通过这种方法引入SQL注入漏洞。由于它涉及客户的名称,因此机会很小,但是尽管如此,确保客户名称中不能包含诸如';DELETE FROM CLIENT;--之类的恶意值还是很好的。