You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对单表唯一列执行动态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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:57:03