【问题标题】:Simplifying the task of writing TSQL that generates dynamic SQL简化编写生成动态 SQL 的 TSQL 的任务
【发布时间】:2015-02-05 16:07:21
【问题描述】:

由于不同的原因,SQL Server 似乎不可避免地需要使用动态 SQL,但生成的代码看起来很复杂且无法维护。 SQL Server Management Studio 的智能停止对文字内的查询起作用,总体而言,所有这些字符串操作的东西在 IMO 中都是一团糟。

您有哪些方法可以简化此操作并使 SQL 更易于维护?

(当然除了根本不直接使用 SQL 并且依赖 ORM,这在我目前的情况下不是一个选项)

编辑:在我当前的特殊情况下,我有一个带有多个过滤参数的 SP,这些参数在 where 子句中使用 like,当参数为 null 或空时,它不应该包含在 where子句,试图避免使用 (@param IS NULL) OR (column LIKE @param) 的动态 sql 会导致性能不佳。

【问题讨论】:

  • 应用内的动态 SQL?还是动态 tsql(在存储过程中)?还是两者兼而有之?
  • (回复:“使用 SQL Server 似乎不可避免地需要使用动态 SQL” - 它可能看起来那样,但实际上你真的确定?如果动态 SQL 确实是解决你正在做的任何事情的唯一明智的解决方案,那么不,没有办法为这样的语句获得适当的 IntelliSense被拆分并分布在几个字符串文字上,这可能是乱序的。你必须忍受它。)
  • 听起来您正在处理“包罗万象”的查询。 IMO 动态 tsql 要走的路——它应该会带来更好的性能。 Here's a good article 解释了可选参数与动态 tsql 的多个谓词的优缺点。

标签: sql-server tsql dynamic-sql maintainability


【解决方案1】:

答案并不多,但我就是这样做的
把它拿出来
我使用 StringBuilder 是为了提高效率并让它排队。
复制粘贴到 SSMS 以清理语法

sbSQLtotal.AppendLine("select #tempCoreAll.[sID], #tempCoreAll.[sParID] ");
sbSQLtotal.AppendLine("  from #tempCoreAll ");
sbSQLtotal.AppendLine(" order by #tempCoreAll.[iden]; "); 
Debug.WriteLine(sbSQLtotal.ToString());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2016-02-18
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多