SQL Server从另一表取值作为列名新增列报2021附近语法错误如何解决
错误原因
拼接动态SQL时,2021-09-08这类带横杠的日期作为列名属于特殊标识符,SQL Server会默认将横杠解析为减号运算符,不会把整段字符串识别为一个完整的列名,因此解析到开头的2021时就会触发语法报错。
修复方案
将动态拼接的列名用方括号[]包裹即可,同时建议添加非空判断,避免stattable1中不存在Adat=1的记录时执行无效的ALTER语句,修复后的代码如下:
DECLARE @Data nvarchar(20) SELECT @Data = Date FROM stattable1 WHERE Adat=1 IF @Data IS NOT NULL BEGIN DECLARE @sql nvarchar(1000) SET @sql = 'ALTER TABLE altertable1 ADD [' + @Data + '] nvarchar(20)' EXEC (@sql) END
注意事项
- 后续查询、修改该动态命名的列时,同样需要用方括号包裹列名,示例:
SELECT [2021-09-08] FROM altertable1 - 按日期动态生成列的设计会大幅提升后续业务代码的维护复杂度,非特殊需求不推荐使用该方案。
内容的提问来源于stack exchange,提问作者Adriand
相关产品推荐
相关产品推荐

