Tsql 变量=MAX()导致语法错误

Tsql 变量=MAX()导致语法错误,tsql,Tsql,下面有一个SQL,它将是一个更大SP的一部分。我收到一个语法错误,我假设这是由于所选变量@ColumnMM在试图使用变量@SQL的字符串执行时包含MAX函数。例如,将第25行@Column1更改为 从MonthlySummary works中选择@Column01='abcd01'就可以了 如何最好地解决此问题 IF OBJECT_ID('New_Report', 'U') IS NOT NULL DROP TABLE New_Report ; CREATE TABLE New_Report

下面有一个SQL,它将是一个更大SP的一部分。我收到一个语法错误,我假设这是由于所选变量@ColumnMM在试图使用变量@SQL的字符串执行时包含MAX函数。例如,将第25行@Column1更改为 从MonthlySummary works中选择@Column01='abcd01'就可以了

如何最好地解决此问题

IF OBJECT_ID('New_Report', 'U') IS NOT NULL
DROP TABLE New_Report
;

CREATE TABLE New_Report (
    Area NVARCHAR(255)
    , Division NVARCHAR(255)
    )
;

DECLARE @Column01 VARCHAR(6)
DECLARE @Column02 VARCHAR(6)
DECLARE @Column03 VARCHAR(6)
DECLARE @Column04 VARCHAR(6)
DECLARE @Column05 VARCHAR(6)
DECLARE @Column06 VARCHAR(6)
DECLARE @Column07 VARCHAR(6)
DECLARE @Column08 VARCHAR(6)
DECLARE @Column09 VARCHAR(6)
DECLARE @Column10 VARCHAR(6)
DECLARE @Column11 VARCHAR(6)
DECLARE @Column12 VARCHAR(6)
;

SELECT @Column01 = MAX(reporting_year)+'01' FROM MonthlySummary
SELECT @Column02 = MAX(reporting_year)+'02' FROM MonthlySummary
SELECT @Column03 = MAX(reporting_year)+'03' FROM MonthlySummary
SELECT @Column04 = MAX(reporting_year)+'04' FROM MonthlySummary
SELECT @Column05 = MAX(reporting_year)+'05' FROM MonthlySummary
SELECT @Column06 = MAX(reporting_year)+'06' FROM MonthlySummary
SELECT @Column07 = MAX(reporting_year)+'07' FROM MonthlySummary
SELECT @Column08 = MAX(reporting_year)+'08' FROM MonthlySummary
SELECT @Column09 = MAX(reporting_year)+'09' FROM MonthlySummary
SELECT @Column10 = MAX(reporting_year)+'10' FROM MonthlySummary
SELECT @Column11 = MAX(reporting_year)+'11' FROM MonthlySummary
SELECT @Column12 = MAX(reporting_year)+'12' FROM MonthlySummary
;

DECLARE @SQL NVARCHAR(MAX)
;

SET @SQL = 'ALTER TABLE New_Report ADD ' + @Column01 + ' VARCHAR(6)';

EXEC sys.sp_executesql @SQL;

和FYI-从月度总结中选择MAXreporting_year+'01'的结果将为202001。“报告年度”是一个VARCHAR4 in MonthlySummary,尽管我知道在使用聚合函数后这并不重要。

请查看文档中的此链接:

基本上,不能将数字字符用作表名、列名等的第一个字符

除此之外,我还看到了一个类型不匹配的问题。MAXU year是一个数字,但“01”、“02”等是文本,因此您需要将它们组合在一起。此外,无论是在代码编写方式方面还是在代码导致服务器执行的工作方面,代码都存在不必要的重复。没有必要在整个表中多次运行相同的聚合

将@MaxYear声明为VARCHAR4 从MonthlySummary中选择@MaxYear=CASTMAXreporting\u year作为varchar4 声明@Column01 VARCHAR9=QUOTENAME'+@MaxYear+'01' 声明@Column02 VARCHAR9=QUOTENAME'+@MaxYear+'02' 声明@Column03 VARCHAR9=QUOTENAME'+@MaxYear+'03' 声明@Column04 VARCHAR9=QUOTENAME'+@MaxYear+'04' 声明@Column05 VARCHAR9=QUOTENAME'+@MaxYear+'05' 声明@Column06 VARCHAR9=QUOTENAME'+@MaxYear+'06' 声明@Column07 VARCHAR9=QUOTENAME'+@MaxYear+'07' 声明@Column08 VARCHAR9=QUOTENAME'+@MaxYear+'08' 声明@Column09 VARCHAR9=QUOTENAME'+@MaxYear+'09' 声明@Column10 VARCHAR9=QUOTENAME'+@MaxYear+'10' 声明@Column11 VARCHAR9=QUOTENAME'+@MaxYear+'11' 声明@Column12 VARCHAR9=QUOTENAME'+@MaxYear+'12'
最后,作为一个良好的实践,我反对这样命名列。如果您想要数据透视,这很好,但是让您的客户机工具担心名称,并根据需要进行调整。这样做,很可能可以大大简化整个过程,甚至可以简化为一个SELECT语句。

不要“假设”。转到实际故障线路,与其他线路隔离。这应该是一个2-5行的复制,尽管实际的错误可以被提取到一个语句中,而不是无关的。您得到的确切错误是什么?消息102,级别15,状态1,第1行“202001”附近的语法不正确。这与MAX本身无关。再次,将其减少到实际失败的情况/行,这与“假定”错误或代表性数据中的最大存根无关,同时删除每个表达式/行,以达到最小的复制情况。哦,是的。他不能用前导号码作为识别器名称。这是现在答案的一部分。