对单表唯一列执行动态PIVOT转置,SQL代码运行报错如何解决
代码核心问题
- 字符串取值未加引号包裹:
acct_name为字符串类型,PIVOT语法的IN子句要求字符串取值必须用单引号包裹,你当前直接拼接的写法会生成非法语法。比如你示例中的四个值,现有代码拼接出来是IN (12345,23456,34567,45678),正确写法应该是IN ('12345','23456','34567','45678') - 变量长度不足:
@idList定义为varchar(500)、@sqlToRun定义为varchar(1000),当acct_name数量超过几十个,或者单条内容较长时,变量内容会被截断,直接触发语法错误 - 缺少特殊字符转义:如果acct_name包含单引号、空格等特殊字符,直接拼接会破坏SQL结构,同时存在注入风险
修正后代码
DECLARE @idList nvarchar(max) = '' -- 用QUOTENAME自动给每个值加单引号,同时转义内容中的单引号 SELECT @idList = @idList + ',' + QUOTENAME(acct_name, '''') FROM ##tmp_accts -- 移除开头多余的逗号 SET @idList = STUFF(@idList, 1, 1, '') DECLARE @sqlToRun nvarchar(max) SET @sqlToRun = ' SELECT * FROM ( SELECT acct_name FROM ##tmp_accts ) AS src PIVOT ( MAX(acct_name) FOR acct_name IN ('+ @idList +') ) AS pvt' EXEC sp_executesql @sqlToRun
补充说明
如果希望输出的列名不带单引号,可以把QUOTENAME(acct_name, '''')改成QUOTENAME(acct_name),生成的IN子句会变成IN ([12345],[23456],[34567],[45678]),执行效果完全一致,可读性更好。
内容的提问来源于stack exchange,提问作者user17127245
相关产品推荐
相关产品推荐

