【问题标题】:Dynamic SQL query with INNER JOIN ON LIKE keyword使用 INNER JOIN ON LIKE 关键字的动态 SQL 查询
【发布时间】:2019-05-06 15:35:25
【问题描述】:

我正在尝试构建动态 SQL 查询。变量@NSQL 包含使用关键字<<INNERJOINKEYWORD>> 作为最后一个连接条件的SQL 查询。

  SET @NSQL = 'SELECT * FROM CLIENT
    <<INNERJOINKEYWORD>>'

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

这项工作正常。

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

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

当我执行SELECT @NSQL 时,文本“#TempTable.ClientName”是查询的一部分,如何使其动态化?

【问题讨论】:

  • 应该是LIKE #TempTable.ClientName + ''%''
  • @Squirrel:差不多。 :) 你忘了前导 %。
  • 每次使用动态 SQL 时,我都会先执行print @sql,然后再执行exec(@sql)。这样,我可以在执行之前看到最终结果。这是调试动态 SQL 语句的简单方法,尤其是当它们生成的 sql 足够容易校对时。
  • print @sql 与我看到动态 SQL 所做的相同 - SELECT @NSQL?

标签: sql sql-server


【解决方案1】:
SET @NSQL = REPLACE(@NSQL,'<<INNERJOINKEYWORD>>',' INNER JOIN #TempTable ON Client.Name LIKE ''%'' + #TempTable.ClientName + ''%''')

但是,请注意,您可能会使用这种方法引入 SQL 注入漏洞。因为涉及到客户端的名字,所以几率很小,不过最好确保客户端的名字不能包含';DELETE FROM CLIENT;--这样的恶意值。

【讨论】:

    猜你喜欢
    • 2012-06-01
    • 2021-10-10
    • 2012-11-04
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多