SQL Server 2008拼接查询字符串被截断为256字符如何解决
问题原因
这个256字符截断是SQL Server 2008 SSMS默认的文本输出限制+隐式字符串转换长度推断共同导致的:
- SSMS默认对「结果到文本」的输出每列最多显示256个字符,全量查询时触发默认截断规则,少量行查询时会临时放宽显示限制
- 多字符串拼接时SQL Server会自动推断返回值长度,未显式指定大类型时会出现隐式截断
解决方案
1. 修改SSMS显示设置(解决显示层面截断)
- 打开SSMS菜单栏的【工具】→【选项】
- 依次展开【查询结果】→【SQL Server】→【结果到文本】
- 将【每列中显示的最大字符数】调整为最大值8192,保存后重启查询窗口生效
如果你的单行拼接结果超过8192字符,需要改用「结果保存到文件」的方式导出,文件输出无8192长度限制。
2. 优化查询语句(解决执行层面截断)
显式将拼接后的整行结果转换为VARCHAR(MAX),避免SQL Server隐式转换时自动截断:
SELECT CAST( LTrim(RTrim(IsNull(CAST([ID] AS VARCHAR(40)),'NULL'))) +'#'+LTrim(RTrim(IsNull(CAST([StoryID] AS VARCHAR(40)),'NULL'))) +'#'+LTrim(RTrim(IsNull(CAST([Foto]AS VARCHAR(40)),'NULL'))) +'#'+LTrim(RTrim(IsNull(CAST([FotoDesc] AS VARCHAR(300)),'NULL'))) +'#'+LTrim(RTrim(IsNull(CAST([Text]AS VARCHAR(1000)),'NULL'))) +'#'+LTrim(RTrim(IsNull(CAST([Vrema]AS VARCHAR(40)),'NULL'))) +'#'+LTrim(RTrim(IsNull(CAST([Organizator] AS VARCHAR(40)),'NULL'))) +'#'+LTrim(RTrim(IsNull(CAST([Logo] AS VARCHAR(150)),'NULL'))) +'#'+LTrim(RTrim(IsNull(CAST([Adress] AS VARCHAR(250)),'NULL'))) +'#'+LTrim(RTrim(IsNull(CAST([Link] AS VARCHAR(150)),'NULL'))) +'#'+LTrim(RTrim(IsNull(CAST([Gis] AS VARCHAR(250)),'NULL'))) +'#'+LTrim(RTrim(IsNull(CAST([Organizator1]AS VARCHAR(250)),'NULL'))) +'#'+LTrim(RTrim(IsNull(CAST([Logo1] AS VARCHAR(250)),'NULL'))) +'#'+LTrim(RTrim(IsNull(CAST([Adress1] AS VARCHAR(1000)),'NULL'))) +'#'+LTrim(RTrim(IsNull(CAST([Link1] AS VARCHAR(500)),'NULL'))) + CHAR(13)+CHAR(10) AS VARCHAR(MAX)) FROM [story].[dbo].[FotoAnons]
3. 程序读取场景注意事项
如果是通过驱动程序读取结果而非在SSMS中查看,需要确认驱动配置中没有设置字符串长度截断阈值,读取字段时按大文本类型处理即可。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

