我正在尝试优化以下语句:
'VI'+CAST(month(GETDATE()) AS NVARCHAR)+'/'+CAST(year(GETDATE()) AS NVARCHAR)
+'/00000' +CAST(@number+1 AS VARCHAR)
该语句产生一个值,就像VI1/2011/000002
参数@number
是一样1
。
我想在删除冗余强制转换语句和提供一种连接字符串和整数的有效方法方面对此进行优化。
我正在尝试优化以下语句:
'VI'+CAST(month(GETDATE()) AS NVARCHAR)+'/'+CAST(year(GETDATE()) AS NVARCHAR)
+'/00000' +CAST(@number+1 AS VARCHAR)
该语句产生一个值,就像VI1/2011/000002
参数@number
是一样1
。
我想在删除冗余强制转换语句和提供一种连接字符串和整数的有效方法方面对此进行优化。
根本没有捷径,SQL Server中没有优雅的字符串连接
不过,您正在混合使用 varchar 和 nvarchar:数据类型优先意味着整个表达式将是 nvarchar。
如果您发现自己在选择数据时经常执行此转换,请尝试使用持久化计算字段。它被添加到表中,SQL Server 会在插入或更新数据时自动计算它。您只需支付一次计算罚款 - 只需支付一次 - 然后每当数据被选择退出时它就会减少 CPU。如果您发现自己使用该字段过滤查询,您甚至可以在其上放置一个索引。
SQL Server 2012 引入了一个似乎非常适合您需求的新功能
CONCAT()
: .下面是一些示例代码:
也就是说,我确实建议其他人必须在您的表示层而不是数据库中进行表示工作。但是,在那些将它放入现有 SQL 查询中更容易的情况下,我相信它
CONCAT()
会很好地为您服务。这涵盖了可编程性方面。我不知道这会有多好,但我敢打赌肯定不会比您现有的解决方案差。
有关更多示例,请查看:
您不能将其作为参数并将其从应用程序层(例如 .net 或 java 或 php...)传递到 SQL proc 中吗?
在 SQL Server 上根本不这样做会简单得多!
正如 gbn 所建议的(这个答案开始是对他的帖子的评论,但在那个领域变得太长而不实用)唯一明显的简单优化是使 VARCHAR 成为 NVARCHAR 并在每次调用时保存一次类型转换。按照您的方式,将显式转换为 VARCHAR,然后隐式转换为 NVARCHAR。或者,如果您无论如何都想在最后输出 VARCHAR,则将 NVARCHAR 设为 VARCHAR。
您也许可以将 to 更改为
CAST(month(GETDATE()) AS NVARCHAR)+'/'+CAST(year(GETDATE()) AS NVARCHAR)
包含CONVERT()
并mm/yyyy
用于SUBSTRING
拉出该部分的字符串 dat 格式。这样你就有了:代替
每次调用。
但实际上,这不会为您节省太多,如果有的话。即使它确实在 CPU 负载或挂钟时间方面节省了任何东西,我预计即使在大型结果集和/或长循环中,它也会非常非常小。并且格式不会完全相同:您当前的格式包括
m/yy
(小于 10 的月份没有前导零)并且这将产生mm/yy
.同意 gbn 将 nvarchar 与 varchar 混合使用,这是使 sql 更易于阅读的另一种方法(不会使其运行速度更快/更慢),可能是:
对比
重要提示:当月份 < 10 时产生不同的结果: