使用动态SQL创建以当日日期时间命名的表时遇语法错误求助
解决SQL Server中特殊格式表名创建报错问题
问题出在SQL Server的标识符命名规则上:常规标识符不能以数字开头,也不能包含-这类特殊字符。当你用2023-11-06-12-10或2023作为表名时,直接拼接SQL语句会让解析器把开头的数字当成数值,导致语法错误。
解决方法很简单,用QUOTENAME()函数对表名进行处理——它会自动给标识符加上方括号[],将其转换为SQL Server认可的分隔标识符,这样就能正常执行创建操作。
修改后的完整代码:
DECLARE @MyTableName sysname; DECLARE @DynamicSQL nvarchar(max); SET @MyTableName = FORMAT (GETDATE(), 'yyyy-MM-dd-hh-mm'); SET @DynamicSQL = N'CREATE TABLE ' + QUOTENAME(@MyTableName) + ' (DocIDNo varchar(255))'; EXEC sp_executesql @DynamicSQL;
补充说明
- 手动给表名加方括号也能解决问题(比如写成
[2023-11-06-12-10]),但QUOTENAME()更安全:如果表名包含特殊字符(比如]),它会自动转义,避免语法错误或SQL注入风险。 - 若偏好使用双引号包裹标识符,需先执行
SET QUOTED_IDENTIFIER ON;,再将表名用双引号包裹,但方括号是SQL Server默认支持的格式,兼容性更强。
内容的提问来源于stack exchange,提问作者jeremyF
相关产品推荐
相关产品推荐

